日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++求解二叉樹(shù)的下一個(gè)結(jié)點(diǎn)問(wèn)題_C 語(yǔ)言

作者:翟天保Steven ? 更新時(shí)間: 2022-06-04 編程語(yǔ)言

題目描述

給定一個(gè)二叉樹(shù)其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。注意,樹(shù)中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn),同時(shí)包含指向父結(jié)點(diǎn)的next指針。下圖為一棵有9個(gè)節(jié)點(diǎn)的二叉樹(shù)。樹(shù)中從父節(jié)點(diǎn)指向子節(jié)點(diǎn)的指針用實(shí)線表示,從子節(jié)點(diǎn)指向父節(jié)點(diǎn)的用虛線表示

示例:

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

返回:9

解析:這個(gè)組裝傳入的子樹(shù)根節(jié)點(diǎn),其實(shí)就是整顆樹(shù),中序遍歷{5,6,7,8,9,10,11},根節(jié)點(diǎn)8的下一個(gè)節(jié)點(diǎn)就是9,應(yīng)該返回{9,10,11},后臺(tái)只打印子樹(shù)的下一個(gè)節(jié)點(diǎn),所以只會(huì)打印9,如下圖,其實(shí)都有指向左右孩子的指針,還有指向父節(jié)點(diǎn)的指針,下圖沒(méi)有畫出來(lái)

數(shù)據(jù)范圍:節(jié)點(diǎn)數(shù)滿足1≤n≤50 ?,節(jié)點(diǎn)上的值滿足1≤val≤100?

要求:空間復(fù)雜度 O(1) ?,時(shí)間復(fù)雜度 O(n)?

示例:

輸入:

{8,6,10,5,7,9,11},8

返回值:

9

解題思路

本題考察數(shù)據(jù)結(jié)構(gòu)樹(shù)的使用。兩個(gè)方法:

1)暴力破解。通過(guò)next指針獲取根結(jié)點(diǎn),對(duì)其進(jìn)行中序排序,排序過(guò)程中用vector存儲(chǔ),然后直接根據(jù)位置輸出即可。

2)結(jié)合中序排序性質(zhì)。若某個(gè)結(jié)點(diǎn)存在右子樹(shù),則右子樹(shù)的最左孩子就是它的下一個(gè)結(jié)點(diǎn);若不存在右子樹(shù),則它的第一個(gè)右父親,就是它的下一個(gè)結(jié)點(diǎn)。

測(cè)試代碼

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;
        // 確定根結(jié)點(diǎn)
        TreeLinkNode* root=pNode;
        while(root->next)
        {
            root=root->next;
        }
        // 中序排序
        vector v;
        inorder(root,v);
        for(int i=0;i &v)
    {
        if(!root)
            return;
        // 中序排序
        inorder(root->left,v);
        v.push_back(root);
        inorder(root->right,v);
    }
};

2)結(jié)合中序排序性質(zhì)

/*
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;
        // 判斷是否存在右子樹(shù)
        if(pNode->right)
        {
            TreeLinkNode* target=pNode->right;
            // 取最左孩子
            while(target->left)
            {
                target=target->left;
            }
            return target;
        }
        // 不存在右子樹(shù),尋找第一個(gè)右父親
        while(pNode->next)
        {
            if(pNode->next->left==pNode)
                return pNode->next;
            pNode=pNode->next;
        }
        return NULL;
    }
    
 
};

原文鏈接:https://blog.csdn.net/zhaitianbao/article/details/123876984

欄目分類
最近更新