题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:一共有三种情况:
1.为空,直接返回null
2.该节点含有右子树:那么其中序遍历的下一个结点就是其右子树最左下的结点,
3.该节点不含右子树:如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。
C++实现:
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; if(!pNode->right){//如果没有右子树 TreeLinkNode* p = pNode; TreeLinkNode* pFather = p->next; //如果没有右子树,那么一直向上找,直到某一个结点是其父节点的左孩子,返回父节点 while(pFather){ if(pFather->left == p){ return pFather; } p = pFather; pFather = p->next; } return NULL;//中序遍历的最后一个结点 } else{//如果存在右子树,那么中序遍历的下一个结点就是右子树最左下结点 TreeLinkNode* pRight = pNode->right; while(pRight->left){ pRight = pRight->left; } return pRight; } } };
相同的思路,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; } if(pNode.right != null){ TreeLinkNode p = pNode.right; while(p.left != null) p = p.left; return p; } while(pNode.next != null){ if(pNode.next.left == pNode) return pNode.next; pNode = pNode.next; } return null; } }