二叉树的下一个结点(寻找中序遍历中某一结点的后继结点)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/ysl_ysl123/article/details/90780765
今日推荐