题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:分多种情况讨论
1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { 8 9 } 10 }; 11 */ 12 class Solution { 13 public: 14 TreeLinkNode* GetNext(TreeLinkNode* pNode) 15 { 16 if(pNode==NULL)return NULL; 17 if(pNode->right)//如果有右子树,那么沿右子树往下最左边的节点即为下一个节点 18 { 19 TreeLinkNode *p=pNode->right; 20 while(p->left)p=p->left; 21 return p; 22 }else{//如果没有右子树,看父节点 23 TreeLinkNode *father=pNode->next; 24 if(father==NULL)return NULL;//如果没有父节点,返回NULL 25 else{ 26 if(father->left==pNode)return father;//如果该节点为父节点的左孩子,则中序遍历下一个节点即为父节点 27 else{ 28 TreeLinkNode *grandFather=father->next; 29 while(grandFather)//如果该节点为父节点的右孩子,则往上不断查找曾祖父节点,直到有一个节点是其父节点的左孩子 30 { 31 if(grandFather->left==father)return grandFather; 32 father=grandFather; 33 grandFather=father->next; 34 } 35 return NULL;//如果找不到,返回NULL 36 } 37 } 38 } 39 } 40 };