题目
给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点不仅包含左右子节点,同时包含指向父节点的指针。
1.思路
def:指定节点为pNode;中序遍历顺序的下一个节点为res
(1)如果pNode有右子树,那么res一定存在于是pNode的右子树中
按照中序遍历的规律,
①如果pNode的右子树有左子树,那么res一定存在于是pNode的右子树的左子树的逻辑位置最左节点,这样只需要while循环找下去就可以了;
②如果pNode的右子树没有左子树,那么res就是pNode.right;
(2)如果pNode没有右子树,那么顺着pNode.next回溯上去,有两种情况
①res.next.left == res,此时需要返回res.next
②res.next.left != res,继续回溯上去,直至满足条件(2)①,或者满足不了,即代表pNode没有下一个节点。
2. 代码(Java)
// 二叉树节点类
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 null;
}
// pNode存在,其实按照题目要求pNode一定合法存在的
TreeLinkNode res = pNode;
if (res .right != null) {
res = res.right;
while (res.left != null) {
res= res.left;
}
return res;
} else if (res.right == null) {
while (res.next != null) {
if (res.next.left == res)
return res.next;
res = res.next;
}
}
return null;
}
}
ps:最开始做题的时候思路错了,理解成需要借助中序遍历来求解答案,但是题目的参数中并没有原始的树,这样的思路就明显不对了,考虑复杂了。直接利用题目中描述的二叉树的特点,尤其是还有next指针指向其双亲节点这一条进行解答就可以。
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/691459e8.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/691459e8.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。