剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
    
    

;

以上是关于剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章

JZ8 二叉树的下一个结点

剑指offer-8 二叉树的下一个节点

剑指offer面试题 8. 二叉树的下一个结点

剑指Offer——二叉树的下一个节点

剑指Offer-二叉树的下一个结点

剑指offer第7题二叉树的下一个节点