58 - 二叉树的中序遍历的下一个节点

题目:

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



中序遍历:先访问当前节点的左子树,再访问当前节点本身,最后访问当前节点的右子树。

因此:

如果给定节点有右子树,则下一个节点是它的右子节点;

如果给定节点没有右子树,需要向上找到一个祖父节点(它是自己父节点的左节点),该祖父节点的父节点就是下一个节点。如果没有找到,返回NULL。

中序遍历顺序为:428591637

如上图中,给定节点9,则无右节点,找到祖父节点2是1的左节点,返回 1 的节点;给定 7 ,最后找到 1 的父节点为NULL,返回NULL

struct BinaryTreeNode
{
    int                    m_nValue;
    BinaryTreeNode*        m_pLeft;
    BinaryTreeNode*        m_pRight;
    BinaryTreeNode*        m_pParent;
};
BinaryTreeNode* GetNext(BinaryTreeNode* pNode) {
    if (pNode == NULL)
        return NULL;
    BinaryTreeNode* pNextNode = NULL;
    // 有右子树,返回右子树中最左的节点
    if (pNode->m_pRight) {
        pNextNode = pNode->m_pRight;
        while (pNextNode->m_pLeft != NULL) {
            pNextNode = pNextNode->m_pLeft;
        }
    } else if (pNode->m_pParent != NULL) {
        //无右子树
        BinaryTreeNode* pCurrent = pNode;
        BinaryTreeNode* pParent = pNode->m_pParent;
        while (pParent != NULL && pCurrent == pParent->m_pRight) {
            // 向上找到一个节点(它是自己父节点的左节点)
            pCurrent = pParent;
            pParent = pCurrent->m_pParent;
        }
        pNextNode = pParent;
    }
    return pNextNode;
}

测试案例见:

https://github.com/zhedahht/ChineseCodingInterviewAppendix/blob/master/NextNodeInBinaryTrees/NextNode.cpp

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 06:27:31

58 - 二叉树的中序遍历的下一个节点的相关文章

【剑指offer】8、二叉树中序遍历的下一个节点

题目 给定一个二叉树和其中一个节点,找出中序遍历的下一个节点.注意:树的节点中除了有指向左右节点的指针,还有指向父节点的指针. 思路 (1)若该节点Node有右子树,则下一个节点就是右子树中的最左节点,就是在右节点中一直往左子树找. (2)若Node没有右子树 (i)Node是左子节点,则下一个节点就是node的父节点. (ii)Node是右子节点,则下一个节点就要一直向上找,找到第一个左子节点,也就是第一种情况. /* struct TreeLinkNode { int val; struct

二叉树中序遍历的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路:分多种情况讨论 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NU

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

[LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? confused what "{1,#,2,3}" means? > read

树结构练习——排序二叉树的中序遍历

树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

lintcode 容易题:Binary Tree Inorder Traversal 二叉树的中序遍历

题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1 2 / 3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val

树结构练习——排序二叉树的中序遍历(二叉搜索树)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj