剑指Offer JZ8 二叉树的下一个结点
1.题目描述
思路分析:
输入的是一个二叉树的序列与一个结点,输出的该结点在中序遍历中的下一个点。拿到手有点蒙,想一下,练习里先不急着暴力解,肯定是有好方法的。但是直接看这个序列看不出什么规律,不如来看看例子,归纳一下从特殊到一般的规律。
归纳一下:1. 有中序遍历结点在右子树最左端点上的。2.有中序遍历下一个结点是parent的。3.中序遍历下一个结点是parent的parent。对于 1的情况,是有右子树的结点。2、3情况都是没有右子树,2是parent的有左子树,且没有右子树,而3是本身就是上一个结点的右子树,而上一个结点可以归为2的情况。当然不要忘记最后一个结点需要返回null。所以代码如下:
代码实现
代码1:总结规律
/*
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==null)
return pNode;
/*当前节点有右子树*/
if(pNode.right!=null){
pNode=pNode.right;
//下一个结点就在右子树的左子树的最左端
while(pNode.left!=null){
pNode=pNode.left;
}
return pNode;
}
/*没有右子树,且不是中序遍历的最后一个结点*/
while(pNode.next!=null){
TreeLinkNode root=pNode.next;
/*是parent节点的左子树就返回根*/
if(root.left==pNode){
return root;
}
/*不是左子树,则下一个结点是parent的parent*/
pNode=pNode.next;
}
/*返回的是二叉树最后一个结点*/
return null;
}
}
最坏情况的时间复杂度:所有的结点都要看一遍T(N)=O(n)
空间复杂度:O(1),只需要建立一个root结点
代码2:暴力解法
我们注意到这棵树有next指针指向parent结点,那么我们也可以通过当前给出的结点一直网上回溯,找到这棵树的根节点,然后把中序遍历求出来存在一个TreeLinkNode型的ArrayList里,然后要啥就从序列里面找出来它的下一个元素就完事了。