中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么求解二叉樹的下一個結點

發布時間:2022-04-01 13:40:36 來源:億速云 閱讀:144 作者:iii 欄目:開發技術

這篇文章主要講解了“C++怎么求解二叉樹的下一個結點”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++怎么求解二叉樹的下一個結點”吧!

題目描述

給定一個二叉樹其中的一個結點,請找出中序遍歷順序的下一個結點并且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的next指針。下圖為一棵有9個節點的二叉樹。樹中從父節點指向子節點的指針用實線表示,從子節點指向父節點的用虛線表示

C++怎么求解二叉樹的下一個結點

示例:

輸入:{8,6,10,5,7,9,11},8

返回:9

解析:這個組裝傳入的子樹根節點,其實就是整顆樹,中序遍歷{5,6,7,8,9,10,11},根節點8的下一個節點就是9,應該返回{9,10,11},后臺只打印子樹的下一個節點,所以只會打印9,如下圖,其實都有指向左右孩子的指針,還有指向父節點的指針,下圖沒有畫出來

C++怎么求解二叉樹的下一個結點

數據范圍:節點數滿足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;
    }
    
 
};

感謝各位的閱讀,以上就是“C++怎么求解二叉樹的下一個結點”的內容了,經過本文的學習后,相信大家對C++怎么求解二叉樹的下一個結點這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

宁夏| 武平县| 大余县| 休宁县| 塔河县| 碌曲县| 石柱| 民勤县| 乳山市| 江孜县| 建平县| 横山县| 鱼台县| 伊春市| 湖南省| 汶川县| 呈贡县| 股票| 石景山区| 徐汇区| 安达市| 西平县| 崇义县| 锡林浩特市| 绵阳市| 宁乡县| 嘉荫县| 大英县| 衡东县| 故城县| 新津县| 济阳县| 延川县| 金门县| 大关县| 鄂托克前旗| 富蕴县| 巢湖市| 三穗县| 寻甸| 吴桥县|