博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
57.二叉树的下一个节点——剑指offer
阅读量:4840 次
发布时间:2019-06-11

本文共 1056 字,大约阅读时间需要 3 分钟。

题目描述

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

思路:首先知道中序遍历的规则是:左根右,然后作图

结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
//分析二叉树的下一个节点,一共有以下情况:
//1.二叉树为空,则返回空;
//2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
//3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。
classSolution{
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if (pNode == NULL)
            returnNULL;
        if (pNode->right != NULL)
        {
            pNode = pNode->right;
            while (pNode->left != NULL)
                pNode = pNode->left;
            returnpNode;
        }
        while (pNode->next != NULL)
        {
            TreeLinkNode *proot = pNode->next;
            if (proot->left == pNode)
                returnproot;
            pNode = pNode->next;
        }
        returnNULL;
    }
};

转载于:https://www.cnblogs.com/developing/articles/11048196.html

你可能感兴趣的文章
luogu P1854 花店橱窗布置
查看>>
6-6 小球下落 uva679
查看>>
Victor and World 状压dp
查看>>
vim 常用设置
查看>>
NGUI所见即所得之UIAtlasMaker , UIAtlas (2)
查看>>
Dynamics AX 2012 R2 耗尽用户
查看>>
项目引入非配置的文件,打成war包后测试报错的可能原因
查看>>
ubuntu更改apache2根目录
查看>>
Hibernate配置属性
查看>>
hibernate.properties
查看>>
那些可能被你忽略的MySQL优化技巧
查看>>
bzoj1034: [ZJOI2008]泡泡堂BNB
查看>>
Android Studio快捷键每日一练(2)
查看>>
atoi函数实现
查看>>
文本文件和二进制文件
查看>>
WCF 实例 —— Android 短信助手 (WCF + Android)
查看>>
C# 读写opc ua服务器,浏览所有节点,读写节点,读历史数据,调用方法,订阅,批量订阅操作...
查看>>
springMVC学习
查看>>
PHP 处理JSON数据
查看>>
SQL Text Literals 文本
查看>>