Java实现填充每个节点的下一个右侧节点指针,对于不是完美二叉树而言
程序员文章站
2022-03-03 11:14:53
...
标题:Java实现填充每个节点的下一个右侧节点指针,对于不是完美二叉树而言
可以先看看这个:Java实现填充每个节点的下一个右侧节点指针,对于完美二叉树而言
一、题解
方法:其实挺有巧劲的
/**
* 测试不完美二叉树
* 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了86.90% 的用户
* @param head
* @return
*/
public Node hasNext(Node head) {
if(head == null) {
return null;
}
Node ap = head;
while(ap != null) {//纵向遍历
Node bp = ap;
Node cp = null; //保存下一排不为null的第一个节点
Node dp = new Node(-1);
boolean flag = false; //注意这句话的位置
while(bp != null) {//横向遍历
if(bp.left != null) {
dp.next = bp.left;
dp = dp.next;
if(!flag) {
flag = true;
cp = bp.left;
}
}
if(bp.right != null) {
dp.next = bp.right;
dp = dp.next;
if(!flag) {
flag = true;
cp = bp.right;
}
}
bp = bp.next;
}
ap = cp;
}
return head;
}
/**
* 不完美二叉树
* @author dell
*
*/
public class TestHasNextNoPerfect {
/**
* 测试不完美二叉树
* 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了86.90% 的用户
* @param head
* @return
*/
public Node hasNext(Node head) {
if(head == null) {
return null;
}
Node ap = head;
while(ap != null) {//纵向遍历
Node bp = ap;
Node cp = null; //保存下一排不为null的第一个节点
Node dp = new Node(-1);
boolean flag = false; //注意这句话的位置
while(bp != null) {//横向遍历
if(bp.left != null) {
dp.next = bp.left;
dp = dp.next;
if(!flag) {
flag = true;
cp = bp.left;
}
}
if(bp.right != null) {
dp.next = bp.right;
dp = dp.next;
if(!flag) {
flag = true;
cp = bp.right;
}
}
bp = bp.next;
}
ap = cp;
}
return head;
}
/**
* 初始化一个tree
* 类广度遍历
* @param a
* @return
*/
public Node initTree(Integer[] a) {
if(a == null || a.length == 0) {
return null;
}
int t = 0;
Node p = new Node(a[t]); //至少有一个元素
Queue<Node> q = new LinkedList<>();
q.offer(p);
while(!q.isEmpty()) {
Node node = q.poll();
if(t + 1 == a.length) { //先判断数组中是否还有下一个元素
return p;
}else {
t++;
if(a[t] == null) { //若下一个元素为null,则不需要创建新的节点
node.left = null;
}else {
node.left = new Node(a[t]);
q.offer(node.left);
}
}
if(t + 1 == a.length) {
return p;
}else {
t++;
if(a[t] != null){ //上面的简写,a[t] == null,不需要再赋值
node.right = new Node(a[t]);
q.offer(node.right);
}
}
}
return p;
}
@Test
public void test() {
Integer[] arr = new Integer[] {1, 2, 3, 4, 5, 9, 10, null, 6, 7, 8, null, null, null, 11};
Node head = this.initTree(arr);
}
}
推荐阅读
-
Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)
-
116. 填充每个节点的下一个右侧节点指针(JS实现)
-
(java实现,层次遍历)填充每个节点的下一个右侧节点指针
-
LeetCode 116. 填充每个节点的下一个右侧节点指针 JAVA
-
leetcode:116. 填充每个节点的下一个右侧节点指针(java树层次遍历bfs)
-
leetcode 116. 填充每个节点的下一个右侧节点指针 C语言层序遍历实现
-
Java实现填充每个节点的下一个右侧节点指针,针对完美二叉树而言
-
[LeetCode 中等 二叉树+链表]117. 填充每个节点的下一个右侧节点指针 II
-
Java实现填充每个节点的下一个右侧节点指针,对于不是完美二叉树而言
-
LeetCode 116. 117 填充每个节点的下一个右侧节点指针 (小巧的递归、链表+二叉树)