zoukankan      html  css  js  c++  java
  • 剑指offer-二叉树的下一个节点

     

    题目描述

     
    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
     

    解题思路

    分情况考虑如下:

    1. 若该节点为空,则直接返回NULL;
    2. 若该节点有右子树,则它的下一个节点一定是右子树中最左边的叶子节点,所以从该节点右孩子开始循环,依次指向它的左孩子节点,直到左孩子节点为空停止,此时指针指向的节点即为目标节点;
    3. 若该节点无右子树,且该节点为它父节点的左孩子,那么中序遍历的下一个节点就是它的父节点;
    4. 若该节点无右子树,且该节点为它父节点的右孩子,此时可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点;
    5. 若以上情况都不满足,则该节点下一个节点为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)
    17             return NULL;
    18         else if(pNode->right){
    19             pNode=pNode->right;
    20             while(pNode->left)
    21                 pNode=pNode->left;
    22             return pNode;
    23         }
    24         else if(pNode->next&&pNode==pNode->next->left)
    25             return pNode->next;
    26         else if(pNode->next&&pNode==pNode->next->right){
    27             while(pNode->next&&pNode!=pNode->next->left)
    28                 pNode=pNode->next;
    29             return pNode->next;
    30         }
    31         else 
    32             return NULL;
    33     }
    34 };
  • 相关阅读:
    js获取当前系统时间
    input标签之外是否一定添加form标签
    用css实现凹陷的线条
    js中的类型和函数参数传递类型问题
    jqDOM操作
    js中null与undefined的区别
    centos 支持复制与粘贴
    docker 部署springboot应用
    springboot springcloud 父项目pom工程创建pom文件
    自写流程图 支持批量展示
  • 原文地址:https://www.cnblogs.com/wmx24/p/8805764.html
Copyright © 2011-2022 走看看