二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
1.分两种情况考虑
(1) 有右子树的情况: 那么它下一个节点就是它的右子树的最左子树 先右转 然后左转一直走!!
(2) 无右子树的情况: (1)如果节点是其父亲节点的左子节点,那么其实我们所要搜寻的下一个节点就是这个父亲节点!!!
(2)如果节点是其父亲节点的右子节点,那么就应该沿着该父亲节点的指针 next 一直向上遍历 ;
直到找到一个节点是其父亲节点的左节点;
/* 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) { TreeLinkNode * parents; if(pNode==nullptr)//检查 return NULL; //第一种情况 存在右子树 if(pNode->right!=NULL) { pNode=pNode->right;//先指向右边 while(pNode->left!=NULL) { pNode=pNode->left; } return pNode; } //第二种情况 while(pNode->next!=NULL)//向上遍历 父亲节点 { parents=pNode->next; //父亲 if(parents->left== pNode){ //其父亲节点的左边节点是当前这个节点 return parents ; //返回父亲节点 } pNode=pNode->next;//一直向后移动 } return NULL;//都不是 就是没找到 } };