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

1 题目描述

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

2 思路和方法

  中序遍历,下一个结点有两种情况

  a. 当前结点有右子树,就找出右子树中的最左的结点;

  b. 当前结点没有右子树  就往它的父节点找,找到第一个结点是它的父节点的左子节点的结点时停止,下一个结点就是该节点的父节点;

作如下表述:

(1)’:有右子树的,那么下个结点就是右子树最左边的点;

(2)’:没有右子树的,给出结点是父结点的左孩子,返回父结点;

(3)’:没有右子树,给出结点是父结点的右孩子,把给出结点的父节点作为下一个遍历的节点,向上回溯,直到当前结点是其父节点的左孩子时停止【直到找到一个父节点X,并且这个父节点X是其本身的父节点Y的左孩子为止】,下一个结点就是当前结点的父节点proot【return proot】。【TreeLinkNode *proot=pNode->next;proot->left==pNode,pNode是当前节点,pNode->next是当前节点的父节点,proot->left是其父结点的左结点】,

例子: 先序遍历:1 2 4 6 7 5 8 3(根左右);  中序遍历:6 4 7 2 5 8 1 3(左根右)【给出的结点为8,下一个结点为1为例】  后序遍历:6 7 4 8 5 2 3 1(左右根)

3 C++核心代码

 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(NULL), right(NULL), next(NULL) {
 8
 9     }
10 };
11 */
12 class Solution {
13 public:
14     TreeLinkNode* GetNext(TreeLinkNode* pNode)
15     {
16         if(pNode==NULL)
17             return NULL;
18         if(pNode->right!=NULL)
19         {
20             pNode=pNode->right;
21             while(pNode->left!=NULL)
22                 pNode=pNode->left;           //有右子树的,那么下个结点就是右子树最左边的点
23             return pNode;
24         }
25         while(pNode->next!=NULL)
26         {                                        //pNode,是当前节点
27             TreeLinkNode *proot=pNode->next;     //proot,当前节点的父节点
28             if(proot->left==pNode)               //proot->left,当前节点的父节点的左结点
29                 return proot;
30             pNode=pNode->next;
31         }
32         return NULL;
33     }
34 };

参考资料

https://blog.csdn.net/langxue4516/article/details/82292216

原文地址:https://www.cnblogs.com/wxwhnu/p/11434288.html

时间: 2024-08-28 00:47:19

剑指offer57:二叉树的下一个结点的相关文章

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

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

剑指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-8 二叉树的下一个节点

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

每天一道剑指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; } }

【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