给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
这题需要对各种情况分类讨论,一共有三种情况
null
A
所有代码
public class Solution { public TreeLinkNode GetNext(TreeLinkNode pNode) { // 1. 右孩子不空,则找到它右孩子的最左孩子 if (pNode.right != null) { pNode = pNode.right; // 找到最左的节点 while (pNode.left != null) pNode = pNode.left; return pNode; } TreeLinkNode parent = pNode.next; if (parent == null) return null; // 2. 右孩子为空,且是父亲的左孩子,父节点为下一节点 if (parent.left == pNode) return pNode.next; // 3. 右孩子为空,且是父亲的右孩子 while (parent != null) { // 向上找父亲,直到节点是其父亲的左孩子,即第二种情况 if (parent.left == pNode) return parent; pNode = parent; parent = parent.next; } return null; } public static void main(String[] args) { TreeLinkNode r = new TreeLinkNode(1); r.left = new TreeLinkNode(2); r.left.next = r; TreeLinkNode pnow = r.left; pnow.right = new TreeLinkNode(3); pnow.right.next = pnow; pnow = pnow.right; pnow.right = new TreeLinkNode(4); pnow.right.next = pnow; TreeLinkNode res = new Solution().GetNext(pnow.right); System.out.println(res.val); } }