JZ8 二叉树的下一个结点
Posted luxiayuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZ8 二叉树的下一个结点相关的知识,希望对你有一定的参考价值。
/* struct TreeLinkNode int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) ; */ #include <exception> class Solution public: vector<TreeLinkNode*> nodes; TreeLinkNode* GetNext(TreeLinkNode* pNode) TreeLinkNode *root = pNode; while(root->next) root = root->next; Inorder(root); int n = nodes.size(); for(int i = 0; i < n - 1; i ++ )//最后一个肯定不存在下一个节点 if(pNode == nodes[i]) return nodes[i + 1]; return nullptr; void Inorder(TreeLinkNode* &root) if(root == nullptr) return;//中序遍历终止条件 Inorder(root->left); nodes.push_back(root); Inorder(root->right); ;
作法二:
二叉树的中序遍历的下一个节点存在三种情况:
1.自身存在右子树,返回右子树的最左边的节点
2.自身是父节点的左子树,则返回父节点
3.自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点
/* struct TreeLinkNode int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) ; */ class Solution public: TreeLinkNode* GetNext(TreeLinkNode* pNode) if(pNode == nullptr) return nullptr;//最好包括,防止头节点传入空指针导致程序报错 //自身存在右子树,返回右子树的最左边的节点 if(pNode->right) TreeLinkNode *rchild = pNode->right; while(rchild->left) rchild = rchild->left; return rchild; //自身是父节点的左子树,则返回父节点 if(pNode->next && pNode->next->left == pNode) return pNode->next; //自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点 if(pNode->next) TreeLinkNode *ppar = pNode->next; while(ppar->next && ppar->right == ppar) ppar = ppar->next; return ppar->next; return nullptr; ;
剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
示例:
输入:8,6,10,5,7,9,11,8
返回:9
解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历5,6,7,8,9,10,11,根节点8的下一个节点就是9,应该返回9,10,11,后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针,下图没有画出来
数据范围:节点数满足1≤n≤50 ,节点上的值满足1≤val≤100
要求:空间复杂度 O(1) ,时间复杂度 O(n)
示例:
输入:
8,6,10,5,7,9,11,8
返回值:
9
解题思路:
本题考察数据结构树的使用。两个方法:
1)暴力破解。通过next指针获取根结点,对其进行中序排序,排序过程中用vector存储,然后直接根据位置输出即可。
2)结合中序排序性质。若某个结点存在右子树,则右子树的最左孩子就是它的下一个结点;若不存在右子树,则它的第一个右父亲,就是它的下一个结点。
测试代码:
1)暴力破解。
/*
struct TreeLinkNode
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL)
;
*/
class Solution
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
if(!pNode)
return NULL;
// 确定根结点
TreeLinkNode* root=pNode;
while(root->next)
root=root->next;
// 中序排序
vector<TreeLinkNode*> v;
inorder(root,v);
for(int i=0;i<v.size();++i)
if(v[i]==pNode&&(i+1)<v.size())
return v[i+1];
return NULL;
// 排序
void inorder(TreeLinkNode* root,vector<TreeLinkNode*> &v)
if(!root)
return;
// 中序排序
inorder(root->left,v);
v.push_back(root);
inorder(root->right,v);
;
2)结合中序排序性质。
/*
struct TreeLinkNode
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL)
;
*/
class Solution
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
if(!pNode)
return NULL;
// 判断是否存在右子树
if(pNode->right)
TreeLinkNode* target=pNode->right;
// 取最左孩子
while(target->left)
target=target->left;
return target;
// 不存在右子树,寻找第一个右父亲
while(pNode->next)
if(pNode->next->left==pNode)
return pNode->next;
pNode=pNode->next;
return NULL;
;
以上是关于JZ8 二叉树的下一个结点的主要内容,如果未能解决你的问题,请参考以下文章
剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)