版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ysl_ysl123/article/details/90780765
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路1
首先想到类似的题目:二叉搜索树与双向链表,即先将二叉树按中序遍历的顺序转成双向链表(或单链表),然后返回给定结点的下一个结点即可。
代码(c++)
/*
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:
void inorder(TreeLinkNode* root,TreeLinkNode* &pre){
if(root!=NULL){
inorder(root->left,pre);
root->left=pre;
if(pre!=NULL) pre->right=root;
pre=root;
inorder(root->right,pre);
}
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL) return NULL;
TreeLinkNode* root=pNode;
while(root->next!=NULL) root=root->next;
TreeLinkNode* pre=NULL;
inorder(root,pre);
return pNode->right;
}
};
思路2
按数据结构中的概念来做判断。
首先往“下”看,即判断当前结点是否有右孩子。如果有右孩子,则在以该右孩子为根结点的子树中寻找最左边的结点,即为当前结点的后继结点。
如果没有右孩子,再往“上”看,即判断当前结点是否是其父结点的左孩子,如果是,则返回父结点;如果不是,则继续往“上”(沿着父结点)遍历,直到遍历到当前结点的某个祖先结点,它是其父结点的左孩子,则返回它的父结点,即为当前结点的后继结点。如果找不到当前结点的某个祖先结点,它是其父结点的左孩子,那么说明当前结点是中序遍历中最后一个结点,返回NULL。
代码(c++)
/*
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==NULL) return NULL;
if(pNode->right!=NULL){
pNode=pNode->right;
while(pNode->left!=NULL) pNode=pNode->left;
return pNode;
}
else{
while(pNode->next!=NULL){
if(pNode->next->left==pNode) return pNode->next;
pNode=pNode->next;
}
return NULL;
}
}
};