微软面试题:补充题12. 二叉树的下一个节点 出现次数:2

题目描述:

       某种二叉树的节点包含指向 左子树、右子树、父节点的 3 个指针,给定该二叉树中的某个节点 ,

返回它的中序遍历的下一个节点的指针。

分析:

节点(设为x)  中序遍历的下一个节点有以下可能:

1.  若x有右子树。则x的下一个节点为x右子树最左侧节点。如,2的下一个节点为8。

2.  若x没有右子树,又分为2种情况。

    2.1  若x是父节点的左孩子。则x的父节点就是x的下一个节点。如,7的下一个节点是4。

    2.2  若x是父节点的右孩子。则沿着父节点向上,直到找到一个节点的父节点的左孩子

           是该节点,则该节点的父节点就是x的下一个节点。如,9的下一个节点是1。

在上溯 的过程中如果到了 根节点仍然 没有找到目标节点,则返回 NULL。

代码:

  

 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)
17         {
18             return NULL;
19         }
20         if(pNode->right != NULL)
21         {
22             TreeLinkNode* ptr = pNode->right;
23             TreeLinkNode* front = ptr;
24             while(ptr != NULL)
25             {
26                 front  = ptr;
27                 ptr = ptr->left;
28             }
29             return front;
30         }
31         else if(pNode->next == NULL || pNode->next->left == pNode)
32         {
33             return pNode->next;
34         }
35         else
36         {
37             while(pNode->next != NULL && pNode == pNode->next->right)
38             {
39                 pNode  = pNode->next;
40             }
41             return pNode->next;
42         }
43     }
44 };
原文地址:https://www.cnblogs.com/wangxf2019/p/14666289.html