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

    牛客网原题目链接:二叉树的下一个结点

    题目描述:

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

    解题思路:

    对于一个给定的二叉树,题目要求中序遍历,中序遍历的顺序是先中序遍历左子树,再根节点,最后中序遍历右子树。

    所以可以使用中序遍历得到整个二叉树的遍历序列,然后再找该节点的下一个值;但是题目要求找的是一个结点,而不是值;所以此法不行。

    那么根据中序遍历的特点来分析:

     由于遍历顺序是先左子树,再根,最后右子树;要找的结点就相当于是根结点,那么他的下一个节点就应在其右子树

    那么就应该讨论该结点是否有右结点

    如果有,那就应该采用此方法遍历其右子树;结果就是其右节点的最左边的结点,或者就是其右节点。

    如果没有,那就要判断该结点是其父结点的左结点还是右结点

      如果是其父的左结点,那下一个就是其父节点;

      否则,就是其父结点的父结点,直到是某个父结点的左结点,下一个就是那个父结点。

    实现代码如下:

     1     public TreeLinkNode GetNext(TreeLinkNode pNode)
     2     {
     3         if(pNode == null){
     4             return null;
     5         }
     6         //判断是否有右结点
     7         if(pNode.right != null){
     8             pNode = pNode.right;
     9             //寻找该结点最左边的结点
    10             while (pNode.left != null){
    11                 pNode = pNode.left;
    12             }
    13             return pNode;
    14         }
    15         //若没有右结点,就找该结点的父结点
    16         while(pNode.next != null){
    17             TreeLinkNode root = pNode.next; //定义一个结点作为当前节点的父结点
    18             if(root.left == pNode){     //若当前结点是其父结点的左结点,下一个结点就是此父节点
    19                 return root;
    20             }
    21             pNode = pNode.next;     //否则就继续找其父节点
    22         }
    23         return null;    //若最终找不到,则没有下一个结点
    24     }
  • 相关阅读:
    一、Flask_安装与使用
    Django_rest_framework(DRF)
    day_45_Django
    meta标签、利用媒体查询 link不同的CSS文件
    文本框设置:随内容增加而增高
    jquery 设置 html标签响应式布局
    CSS hack处理
    一些前端网址记录
    前端学习之路
    图片轮播(手动点击)
  • 原文地址:https://www.cnblogs.com/shengguilv/p/13021047.html
Copyright © 2011-2022 走看看