每天一道剑指offer-二叉树的下一个结点

题目

https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&tPage=4&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

题目详述

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

题目详解

思路

分析二叉树的下一个节点,一共有以下情况:

1.二叉树为空,则返回空;

2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;

3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。代码如下:

代码

/*
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 temp = pNode.right;
            while(temp.left != null)
                temp = temp.left;
            return temp;
        }
        TreeLinkNode temp = pNode.next;//父节点
        TreeLinkNode pre = pNode;//当前节点
        while(temp != null)
        {
            if(temp.left == pre)
                return temp;//如果当前节点pre是父节点的左子树,那么父节点就是下一个节点,终止循环
            pre = temp;//如果不是,那么就pre指向父节点
            temp = temp.next;//父节点指向自己的父节点,也就是向上一层移动
        }
        return temp;
    }
}

原文地址:https://www.cnblogs.com/qiaogeli/p/10415905.html

时间: 2024-11-07 18:41:05

每天一道剑指offer-二叉树的下一个结点的相关文章

剑指offer 二叉树的下一个结点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 1)如果一个节点有右子树,那么它的下一个结点就是它的右子树中的最左子节点: 2)如果一个节点没有右子树,并且它还是它父节点的右子节点,我们可以沿着指向父节点的指针一直向上遍历,知道找到一个是它父节点的右子节点的左子节点的节点,就是第一个向右转的子部分根节点. /* struct TreeLinkNode { int val; struct Tr

剑指Offer——二叉树的下一个结点

题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 如果该结点存在右子树,那么返回右子树的最左结点. 如果该结点不存在右子树,那么如果该结点不是其父结点的最右结点,那么返回父结点:否则一直找到最大子树的最右结点是该结点,那么返回该最大子树的根结点的父结点. 代码: 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *le

每天一道剑指offer-二叉树的下一个结点1

题目 每天一道剑指offer-二叉树的下一个结点https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&tPage=4&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking 题目详述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个

剑指Offer——二叉树的下一个节点

1.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2.代码实现 /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; 指向父节点 TreeLinkNode(int val) { this.val = val; } }

剑指Offer-57.二叉树的下一个结点(C++/Java)

题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 二叉树的中序遍历是左根右,所以如果一个结点的右子树不为空,那么这个节点的下一个节点一定是右子树的最左结点,如果右子树不存在左子树的话,就返回右子树的根结点. 如果一个结点的右子树为空,且当前结点是其父结点的左子树的根结点,那么直接返回其父节点,否则就一直访问其父结点,直到找到一个结点是其父结点的左子结点,同样返回其父结点. 程序: C++ cla

剑指offer-8 二叉树的下一个节点

剑指offer-8 二叉树的下一个节点 题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 右侧有节点,直接打印 右侧没节点 此节点的父节点的左节点是自己,打印 此节点的父节点的右节点是自己,向上继续找,直到满足2.1 自己解答: /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right

【Java】 剑指offer(7) 二叉树的下一个结点

本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. 思路 首先自己在草稿纸上画图,进行分析(不再展开).可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点: 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点: (2)若当前结点为其父结点的右子结点时,继续向上遍

二叉树的下一个结点-剑指Offer

二叉树的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路 当该结点有右子树时,下一个结点就是右子树中最左的那个结点 当该结点没有右子树,而且是父节点的左子树,那下一个结点就是父节点 当该结点没有右子树,而且是父节点的右子树,那就向上寻找直到是某个父节点的左子树,然后改父节点就是下一个结点,如果找到根节点还没有找到满足条件的父节点,那就是没有下一个结点 代码 /* public cla

【剑指offer】面试题 8. 二叉树的下一个结点

面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. Java 实现 略 原文地址:https://www.cnblogs.com/hglibin/p/10930092.html