zoukankan      html  css  js  c++  java
  • 微软面试题:补充题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 };
  • 相关阅读:
    经典入门_排序
    经典入门_贪心算法
    经典入门_Hash的应用
    经典入门_排序
    uva 839
    uva 327
    uva 699
    uva 712
    uva 297
    uva 548
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/14666289.html
Copyright © 2011-2022 走看看