面试题8:二叉树的下一个节点

一.题目

给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。

二.思路

分析题目之后,我们发现,待处理节点只存在三种状态,我们分别处理即可:

  1. 待处理节点有右子树。那么它的下一个节点为其右子树的最左子节点,如上图节点3的下一个节点为8;
  2. 待处理节点无右子树,且是父节点的左节点。那么它的下一个节点为其父节点,如上图节点5的下一个节点为3;
  3. 待处理节点无右子树,且是父节点的右节点。我们可以沿着它的父节点向上遍历,直至找到一个这样的节点,该节点是其父节点的左子节点,那么该节点的父节点就是所求节点,如上图节点6的下一个节点为1.

三.代码

BinaryTreeNode* GetNext(BinaryTreeNode* pNode){

    if(pNode == nullptr)
        return nullptr;

    BinaryTreeNode* pNext = nullptr;
    if(pNode->m_pRight != nullptr){
        BinaryTreeNode* pRight = pNode->m_pRight;
        while(pRight->m_pLeft != nullptr)
            pRight = pRight->m_pLeft;
        pNext = pRight;

    }

    else if(pNode->m_pParent != nullptr){
        BinaryTreeNode* pCurrent = pNode;
        BinaryTreeNode* pParent = pNode->m_pParetn;

        while(pParent != nullptr && pNode = pParent->m_pRight){
            pCurrent = pParent;
            pParent = pParent->m_pParent;
        }
        pNext = pParent;

    }
    return pNext;

}

四.本题考点

  1. 考查应聘者对二叉树遍历的理解程度。只有对二叉树的遍历算法有了深刻的理解,应聘者才有可能准确找出每个节点的中序遍历的下一个节点。
  2. 考查应聘者分析复杂问题的能力。应聘者只有画出二叉树的结构图、通过具体的例子找出中序遍历的下一个节点的规律,才有可能设计出可行的算法。

原文地址:https://www.cnblogs.com/ovs98/p/9876129.html

时间: 2024-11-13 09:51:55

面试题8:二叉树的下一个节点的相关文章

[ 剑指offer ] 面试题8:二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 1.找到所有的可能情况并归纳,写的代码需要把这些情况都覆盖到. 2.具体情况详见书本# -*- coding:utf-8 -*- # class TreeLinkNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # self

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

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

59.二叉树的下一个节点

题目描述: ??给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路分析: ??二叉树的下一个节点,一共有以下情况: ??1.二叉树为空,返回空 ??2.节点的右孩子存在,则设置一个指针从右孩子出发,一直沿着左子节点的指针找到的叶子节点即为下一个节点. ??3.节点不是根节点,如果节点时父节点的左孩子,那么父节点就是下一个节点,否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果. 代码: /* pub

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

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

剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)

题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况: 1.有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点: 2.没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点: 3.如果不是其父节点

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

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目分析 这题一定要画图,因为只有画图我们才能分清楚下一个节点有哪些情况 1.如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点.也就是说,从右子节点出发一直沿着指向左子节点的指针,我们就能找到下一个节点. 2.如果没有右子树,又可以分为两种情况 如果节点是它父节点的左子节点,那么它的下一个节点就是它的父节点. 如果一个节点既没有右子

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

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

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

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

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

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