国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷

這篇具有很好參考價(jià)值的文章主要介紹了【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1,二叉樹的種類

滿二叉樹

除最后一層無任何子節(jié)點(diǎn)外,每一層上的所有結(jié)點(diǎn)都有兩個子結(jié)點(diǎn)的二叉樹。
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

完全二叉樹

一個深度為k的有n個節(jié)點(diǎn)的二叉樹,對樹中的節(jié)點(diǎn)按從上至下、從左到右的順序進(jìn)行編號,如果編號為i(1≤i≤n)的結(jié)點(diǎn)與滿二叉樹中編號為i的結(jié)點(diǎn)在二叉樹中的位置相同,則這棵二叉樹稱為完全二叉樹。
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

二叉搜索樹

二叉搜索樹(Binary Search Tree),又名二叉排序樹(Binary Sort Tree)。

二叉搜索樹是具有有以下性質(zhì)的二叉樹:

若左子樹不為空,則左子樹上所有節(jié)點(diǎn)的值均小于或等于它的根節(jié)點(diǎn)的值。
若右子樹不為空,則右子樹上所有節(jié)點(diǎn)的值均大于或等于它的根節(jié)點(diǎn)的值。
左、右子樹也分別為二叉搜索樹。
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

平衡二叉搜索樹

平衡二叉搜索樹的任何結(jié)點(diǎn)的左子樹和右子樹高度最多相差1。,并且左右兩個子樹都是一棵平衡二叉樹。
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

容器map、set、multimap、multiset的底層原理都是平衡二叉搜索樹
所以map中key和set中的元素都是有序的

unordered map和unordered set的底層原理為哈希表

2,存儲方式

分為鏈?zhǔn)酱鎯途€式存儲

鏈?zhǔn)酱鎯?/h3>

鏈?zhǔn)酱鎯Ψ绞骄陀弥羔?br>【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

線式存儲

(用的少了解即可)

順序存儲的方式就是用數(shù)組。
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)

線式存儲時,有一點(diǎn)i,他的左孩子下標(biāo)為2i+1,他的右孩子下標(biāo)為2i+2

3,二叉樹的遍歷

分為深度優(yōu)先搜索和廣度優(yōu)先搜索

深度優(yōu)先搜索

分為前序遍歷、中序遍歷、后續(xù)遍歷
【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷,代碼隨想錄筆記,數(shù)據(jù)結(jié)構(gòu)
寫法可以分為遞歸法和迭代法

遞歸的底層原理是棧

確定遞歸函數(shù)的參數(shù)和返回值
確定終止條件
確定單層遞歸的邏輯

迭代法就是模擬遞歸的過程,因?yàn)檫f歸的底層原理為棧,所以迭代法用棧展示

面試簡單的可能需要寫出簡單的非遞歸代碼

前序遍歷(遞歸法、迭代法)

中左右
遞歸法:

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

迭代法:
因?yàn)槟M棧的過程,前序遍歷是中左右,但是棧是先進(jìn)后出的,所以入棧順序?yàn)橛易笾?/p>

訪問順序和處理順序相同(后續(xù)遍歷也是如此,所以稍作改動就可以變?yōu)楹罄m(xù)遍歷)

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();                       // 中
            st.pop();
            result.push_back(node->val);
            if (node->right) st.push(node->right);           // 右(空節(jié)點(diǎn)不入棧)
            if (node->left) st.push(node->left);             // 左(空節(jié)點(diǎn)不入棧)
        }
        return result;
    }
};

中序遍歷(遞歸法、迭代法)

左中右
遞歸法:

void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    vec.push_back(cur->val);    // 中
    traversal(cur->right, vec); // 右
}

迭代法:
訪問順序和處理順序不同,所以代碼和前后續(xù)遍歷不同

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) { // 指針來訪問節(jié)點(diǎn),訪問到最底層
                st.push(cur); // 將訪問的節(jié)點(diǎn)放進(jìn)棧
                cur = cur->left;                // 左
            } else {
                cur = st.top(); // 從棧里彈出的數(shù)據(jù),就是要處理的數(shù)據(jù)(放進(jìn)result數(shù)組里的數(shù)據(jù))
                st.pop();
                result.push_back(cur->val);     // 中
                cur = cur->right;               // 右
            }
        }
        return result;
    }
};

后序遍歷(遞歸法、迭代法)

左右中
遞歸法:

void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
    vec.push_back(cur->val);    // 中
}

迭代法:
訪問順序和處理順序相同

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);
            if (node->left) st.push(node->left); // 相對于前序遍歷,這更改一下入棧順序 (空節(jié)點(diǎn)不入棧)
            if (node->right) st.push(node->right); // 空節(jié)點(diǎn)不入棧
        }
        reverse(result.begin(), result.end()); // 將結(jié)果反轉(zhuǎn)之后就是左右中的順序了
        return result;
    }
};

廣度優(yōu)先搜索

層次遍歷(迭代法、遞歸法)

借助一個隊(duì)列,保存每一層的節(jié)點(diǎn)

隊(duì)列記錄當(dāng)前層的元素個數(shù),彈出時按隊(duì)列里儲存的個數(shù)彈出

迭代法:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        vector<vector<int>> result;
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            // 這里一定要使用固定大小size,不要使用que.size(),因?yàn)閝ue.size是不斷變化的
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};

遞歸法:文章來源地址http://www.zghlxwxcb.cn/news/detail-642411.html

class Solution {
public:
    void order(TreeNode* cur, vector<vector<int>>& result, int depth)
    {
        if (cur == nullptr) return;
        if (result.size() == depth) result.push_back(vector<int>());
        result[depth].push_back(cur->val);
        order(cur->left, result, depth + 1);
        order(cur->right, result, depth + 1);
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        int depth = 0;
        order(root, result, depth);
        return result;
    }
};

4,二叉樹的定義

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

到了這里,關(guān)于【二叉樹】1-5,理論基礎(chǔ)、前中后序遍歷的遞歸法和迭代法、層序遍歷的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)——二叉樹線索化遍歷(前中后序遍歷)

    數(shù)據(jù)結(jié)構(gòu)——二叉樹線索化遍歷(前中后序遍歷)

    為什么要轉(zhuǎn)換為線索化 ????????二叉樹線索化是一種將普通二叉樹轉(zhuǎn)換為具有特殊線索(指向前驅(qū)和后繼節(jié)點(diǎn))的二叉樹的過程。這種線索化的目的是為了提高對二叉樹的遍歷效率,特別是在不使用遞歸或棧的情況下進(jìn)行遍歷。 ? ? ? ??將二叉樹線索化的主要目的是為了

    2024年02月09日
    瀏覽(22)
  • ( “樹” 之 前中后序遍歷) 145. 二叉樹的后序遍歷 ——【Leetcode每日一題】

    ( “樹” 之 前中后序遍歷) 145. 二叉樹的后序遍歷 ——【Leetcode每日一題】

    層次遍歷順序:[1 2 3 4 5 6] 前序遍歷順序:[1 2 4 5 3 6] 中序遍歷順序:[4 2 5 1 3 6] 后序遍歷順序:[4 5 2 6 3 1] 層次遍歷使用 BFS 實(shí)現(xiàn),利用的就是 BFS 一層一層遍歷的特性;而前序、中序、后序遍歷利用了 DFS 實(shí)現(xiàn)。 前序、中序、后序遍只是在對節(jié)點(diǎn)訪問的順序有一點(diǎn)不同,其它

    2023年04月20日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的前中后序遍歷(C語言)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的前中后序遍歷(C語言)

    [二叉樹] 顧名思義就是有 兩個分支節(jié)點(diǎn)的樹,不僅如此,除了葉子外的所有節(jié)點(diǎn)都具有兩個分支節(jié)點(diǎn); 由于結(jié)構(gòu)像一棵倒立的樹,顧名思義為二叉樹 ; 如下圖所示,該圖即為一棵 野生的二叉樹 ; 既然二叉樹為樹,固然有著和樹一樣的部分( 葉子、根、分支… ) 這些也成為

    2024年02月17日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu) | 二叉樹的概念及前中后序遍歷

    數(shù)據(jù)結(jié)構(gòu) | 二叉樹的概念及前中后序遍歷

    下面內(nèi)容來自百度百科 二叉樹(Binary tree)是樹形結(jié)構(gòu)的一個重要類型。許多實(shí)際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹形式,即使是一般的樹也能簡單地轉(zhuǎn)換為二叉樹,而且二叉樹的存儲結(jié)構(gòu)及其算法都較為簡單,因此二叉樹顯得特別重要。二叉樹特點(diǎn)是每個節(jié)點(diǎn)最多只能

    2024年02月05日
    瀏覽(24)
  • C++ 二叉樹(建立、銷毀、前中后序遍歷和層次遍歷,尋找雙親結(jié)點(diǎn)等)

    C++ 二叉樹(建立、銷毀、前中后序遍歷和層次遍歷,尋找雙親結(jié)點(diǎn)等)

    (1) 結(jié)構(gòu)體和類定義 (2)創(chuàng)建二叉樹 (3)前中后序遍歷和層序遍歷 (4)復(fù)制二叉樹 (5)銷毀二叉樹 (6)析構(gòu)函數(shù) (7)求樹的高度 (8)獲取結(jié)點(diǎn),判斷其是否在二叉樹中 (9)計(jì)算結(jié)點(diǎn)個數(shù)和獲取結(jié)點(diǎn)個數(shù) (10)二叉樹判空 (11)獲取根結(jié)點(diǎn) 源代碼: btree.h btree.cp

    2024年02月13日
    瀏覽(59)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的·深度優(yōu)先遍歷(前中后序遍歷)and·廣度優(yōu)先(層序遍歷)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的·深度優(yōu)先遍歷(前中后序遍歷)and·廣度優(yōu)先(層序遍歷)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個人主頁 :阿然成長日記 ??點(diǎn)擊可跳轉(zhuǎn) ?? 個人專欄: ??數(shù)據(jù)結(jié)構(gòu)與算法??C語言進(jìn)階 ?? 不能則學(xué),不知則問,恥于問人,決無長進(jìn) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? (1) 先序遍歷 的過

    2024年01月24日
    瀏覽(31)
  • (“樹” 之 前中后序遍歷 ) 94. 二叉樹的中序遍歷 ——【Leetcode每日一題】

    (“樹” 之 前中后序遍歷 ) 94. 二叉樹的中序遍歷 ——【Leetcode每日一題】

    層次遍歷順序:[1 2 3 4 5 6] 前序遍歷順序:[1 2 4 5 3 6] 中序遍歷順序:[4 2 5 1 3 6] 后序遍歷順序:[4 5 2 6 3 1] 層次遍歷使用 BFS 實(shí)現(xiàn),利用的就是 BFS 一層一層遍歷的特性;而前序、中序、后序遍歷利用了 DFS 實(shí)現(xiàn)。 前序、中序、后序遍只是在對節(jié)點(diǎn)訪問的順序有一點(diǎn)不同,其它

    2023年04月23日
    瀏覽(21)
  • 二叉樹(下)+Leetcode每日一題——“數(shù)據(jù)結(jié)構(gòu)與算法”“對稱二叉樹”“另一棵樹的子樹”“二叉樹的前中后序遍歷”

    二叉樹(下)+Leetcode每日一題——“數(shù)據(jù)結(jié)構(gòu)與算法”“對稱二叉樹”“另一棵樹的子樹”“二叉樹的前中后序遍歷”

    各位CSDN的uu們你們好呀,今天小雅蘭的內(nèi)容仍然是二叉樹和Leetcode每日一題,下面,就讓我們進(jìn)入二叉樹的世界吧!!! 這個題目需要重新定義一個函數(shù),函數(shù)參數(shù)需要有左子樹和右子樹,題目所給定的函數(shù)無法解決問題。 每個不為空的結(jié)點(diǎn),都可以認(rèn)為是一棵子樹的根?

    2024年02月16日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】前中后層序遍歷 --二叉樹的結(jié)構(gòu)特點(diǎn)與遍歷方式

    【數(shù)據(jù)結(jié)構(gòu)】前中后層序遍歷 --二叉樹的結(jié)構(gòu)特點(diǎn)與遍歷方式

    ? Halo,這里是Ppeua。平時主要更新C語言,C++,數(shù)據(jù)結(jié)構(gòu)算法......感興趣就關(guān)注我吧!你定不會失望。 ??個人主頁:主頁鏈接 ??算法專欄:專欄鏈接 ????? 我會一直往里填充內(nèi)容噠! ??LeetCode專欄:專欄鏈接? ???? 目前在刷初級算法的LeetBook 。若每日一題當(dāng)中有力所能

    2023年04月09日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)——二叉樹的先中后序遍歷

    數(shù)據(jù)結(jié)構(gòu)——二叉樹的先中后序遍歷

    ——本節(jié)內(nèi)容為Bilibili王道考研《數(shù)據(jù)結(jié)構(gòu)》P43~P45視頻內(nèi)容筆記。 目錄 一、二叉樹的先中后序遍歷 1.先中后序遍歷 2.舉例 ?3.先中后序遍歷和前中后綴的關(guān)系 4.代碼實(shí)現(xiàn) 5.求遍歷序列 6.應(yīng)用:求樹的深度 二、二叉樹的層次遍歷 1.層次遍歷 2.算法思想: 3.算法演示: 4.代碼實(shí)

    2024年02月12日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包