• 剑指offer(五十七):二叉树的下一个结点


    题目描述

    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
    思路:一共有三种情况:
    1.为空,直接返回null
    2.该节点含有右子树:那么其中序遍历的下一个结点就是其右子树最左下的结点,
    3.该节点不含右子树:如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。

    C++实现:

    /*
    struct TreeLinkNode {
        int val;
        struct TreeLinkNode *left;
        struct TreeLinkNode *right;
        struct TreeLinkNode *next;
        TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
            
        }
    };
    */
    class Solution {
    public:
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            if(!pNode)
                return NULL;
            if(!pNode->right){//如果没有右子树
                TreeLinkNode* p = pNode;
                TreeLinkNode* pFather = p->next;
                //如果没有右子树,那么一直向上找,直到某一个结点是其父节点的左孩子,返回父节点
                while(pFather){
                    if(pFather->left == p){
                        return pFather;
                    }
                    p = pFather;
                    pFather = p->next;
                }
                return NULL;//中序遍历的最后一个结点
            }
            else{//如果存在右子树,那么中序遍历的下一个结点就是右子树最左下结点
                TreeLinkNode* pRight = pNode->right;
                while(pRight->left){
                    pRight = pRight->left;
                }
                return pRight;
            }
        }
    };

     相同的思路,java实现,代码稍微做了优化,但是思路是一致的

    /*
    public class TreeLinkNode {
        int val;
        TreeLinkNode left = null;
        TreeLinkNode right = null;
        TreeLinkNode next = null;
    
        TreeLinkNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
        public TreeLinkNode GetNext(TreeLinkNode pNode)
        {
            if(pNode == null){
                return null;
            }
            if(pNode.right != null){
                TreeLinkNode p = pNode.right;
                while(p.left != null)
                    p = p.left;
                return p;
            }
            while(pNode.next != null){
                if(pNode.next.left == pNode)
                    return pNode.next;
                pNode = pNode.next;
            }
            return null;
        }
    }

  • 相关阅读:
    在excel实现多级联动
    发送邮件使用html模板的实现的大致思路
    设计模式的定义和分类
    yb课堂之用户登陆校验拦截器开发 《十一》
    CTF中常用的php伪协议利用
    Docker
    从零开始的Wordpress个人博客搭建
    .htaccess文件配置理解
    disable_function绕过--利用LD_PRELOAD
    信息安全实习生面试小结
  • 原文地址:https://www.cnblogs.com/ttzz/p/13472163.html
Copyright © 2020-2023  润新知