/*
* 面试题8:二叉树的下一个节点
* 题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
* 思路:如果有右子树,下一节点就是右子树的最左节点。
* 如果没有右子树,如果它是父节点的左子树,下一节点就是父节点。
* 如果不是父节点的左子树,向上遍历,找出父节点的左子树;
* 如果存在,就是这个父节点,不存在就是null。
*/
public class No8GetNext {
public static void main(String[] args) {
No8GetNext n = new No8GetNext();
TreeLinkNode a = new TreeLinkNode(1);
TreeLinkNode b = new TreeLinkNode(2);
TreeLinkNode c = new TreeLinkNode(3);
TreeLinkNode d = new TreeLinkNode(4);
TreeLinkNode e = new TreeLinkNode(5);
TreeLinkNode f = new TreeLinkNode(6);
TreeLinkNode g = new TreeLinkNode(7);
TreeLinkNode h = new TreeLinkNode(8);
TreeLinkNode i = new TreeLinkNode(9);
a.left = b;
a.right = c;
b.left = d;
b.right = e;
c.left = f;
c.right = g;
e.left = h;
e.right = i;
h.next = e;
i.next = e;
e.next = b;
d.next = b;
f.next = c;
g.next = c;
b.next = a;
c.next = a;
TreeLinkNode tn = n.GetNext(g);
System.out.println(tn.val);
}
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if (pNode == null) {
return null;
}
if (pNode.right != null) {//如果有右子树,则找右子树的最左节点
pNode = pNode.right;
while (pNode.left != null) {
pNode = pNode.left;
}
return pNode;
}
while (pNode.next != null) {//没右子树,则找第一个当前节点是父节点左孩子的节点
if (pNode.next.left == pNode) {
return pNode.next;
}
pNode = pNode.next;
}
return null;//退到了根节点仍没找到,则返回null
}
}
面试题8:二叉树的下一个节点
最新推荐文章于 2019-12-25 12:09:24 发布