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

题目:

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

分析:

二叉树的中序遍历是左根右,所以如果一个结点的右子树不为空,那么这个节点的下一个节点一定是右子树的最左结点,如果右子树不存在左子树的话,就返回右子树的根结点。

如果一个结点的右子树为空,且当前结点是其父结点的左子树的根结点,那么直接返回其父节点,否则就一直访问其父结点,直到找到一个结点是其父结点的左子结点,同样返回其父结点。

程序:

C++

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode == nullptr)
            return pNode;
        if(pNode->right != nullptr){
            pNode = pNode->right;
            while(pNode->left != nullptr)
                pNode = pNode->left;
            return pNode;
        }
        while(pNode->next != nullptr && pNode->next->left != pNode){
            pNode = pNode->next;
        }
        return pNode->next;
    }
};

Java

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode == null)
            return pNode;
        if(pNode.right != null){
            TreeLinkNode p = pNode.right;
            while(p.left != null)
                p = p.left;
            return p;
        }
        while(pNode.next != null && pNode.next.left != pNode){
            pNode = pNode.next;
        }
        return pNode.next;
    }
}

原文地址:https://www.cnblogs.com/silentteller/p/12114894.html

时间: 2024-10-08 00:12:16

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

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

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

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

题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. class TreeLinkNode: def __init__(self, x): self.val = x self.left = None self.right = None self.parent = None class Solution: """ 给定节点,求中序遍历下该节点的下一个节点 """

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

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目的意思是,在一颗二叉树的中序遍历中,给出其中一个节点,让你找到中序中该节点的下一个节点 题解: 情况 1:某节点有右子树,下一节点为右子树中的最左子节点 情况 2:某节点无右子树,且就是他父节点左子节,则下一节点为父节点 情况 3:某节点无右子树,且为他父节点的右子节点,则向上递归寻找它的父节点,直到根节点或某个父节点是它自身父节点的左子节点 1

剑指offer(python)------二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 这道题意即:给定一个节点,按照中序遍历(左根右)的方式求该节点的下一个节点.有三种情况:1. 给定的节点为空——返回空:例如:A2. 给定的节点有右子树——沿着该右子树,返回右子树的第一个左叶子节点:例如:E节点的下一个节点是M3. 给定的节点没有右子树——如果位于某个节点的左子树中,则上溯直至找到该节点:否则就返回空.[因为按照中序遍历“左中右”的遍

剑指offer57:二叉树的下一个结点

1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a. 当前结点有右子树,就找出右子树中的最左的结点: b. 当前结点没有右子树  就往它的父节点找,找到第一个结点是它的父节点的左子节点的结点时停止,下一个结点就是该节点的父节点: 作如下表述: (1)’:有右子树的,那么下个结点就是右子树最左边的点: (2)’:没有右子树的,给出结点是父结点的左孩子

57二叉树的下一个结点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 如果一个节点有右子树,那么他的下一个节点就是它的右子树中的最左节点. 如果一个节点没有右子树,如果节点是它父节点的左子节点,那么它的下一个节点就是它的父节点. 如果一个节点即没有右子树,并且它还是它父节点的右子节点,我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是他父节点的左子节点的节点. 1 /* 2 public class Tre

57.二叉树的下一个结点(python)

思路 如果该节点有右节点,那么它的下一个结点就是其右子树的最左节点 否则,如果他是父节点的左节点,则返回他的父节点,否则往上找,直到他的某个父节点a是a父节点的左节点,返回a的父节点. 1 class Solution: 2 def GetNext(self, pNode): 3 # write code here 4 if pNode.right!=None: 5 tmpNode = pNode.right 6 while tmpNode.left: 7 tmpNode=tmpNode.lef

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

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

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

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