二叉树中序遍历的下一个节点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
 
思路:分多种情况讨论
 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 };

 

posted @ 2018-02-04 11:03  jeysin  阅读(214)  评论(0编辑  收藏  举报