JZ8 二叉树的下一个结点
题源 👉二叉树的下一个结点_牛客题霸_牛客网 (nowcoder.com)
题目描述:
具体实现:
方法一:递归 👉 二叉树的下一个结点_牛客博客 (nowcoder.net)
import java.util.*;
public class Solution {
ArrayList<TreeLinkNode> nodes = new ArrayList<>();
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 获取根节点
TreeLinkNode root = pNode;
while(root.next != null) root = root.next;
// 中序遍历打造nodes
InOrder(root);
// 进行匹配
int n = nodes.size();
for(int i = 0; i < n - 1; i++) {
TreeLinkNode cur = nodes.get(i);
if(pNode == cur) {
return nodes.get(i+1);
}
}
return null;
}
// 中序遍历
void InOrder(TreeLinkNode root) {
if(root != null) {
InOrder(root.left);
nodes.add(root);
InOrder(root.right);
}
}
}
时间:O(n)
空间:O(n)
方法二:分类寻找 👉 二叉树的下一个结点_牛客博客 (nowcoder.net)
(第三种情况本人没考虑到,看了官方题解)
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 有右子树,找到右子树最左下结点
if(pNode.right != null){
TreeLinkNode p = pNode.right;
while(p.left != null) p = p.left;
return p;
}
// 右子树不存在,当前pNode为其父结点的左结点
if(pNode.next != null && pNode.next.left == pNode){
return pNode.next;
}
// 右子树不存在,当前pNode为其父结点的右结点,
// 沿左上方父结点爬树,直到爬到当前结点是其父结点的左节点为止,返回 这个父结点
if(pNode.next != null){
TreeLinkNode p = pNode.next;
while(p.next != null && p.next.right == p) p = p.next;
return p.next;
}
return null;
}
}
时间:O(n)
空间:O(1)