1. 程式人生 > >二叉樹基本數學知識,建立及三種遞迴遍歷

二叉樹基本數學知識,建立及三種遞迴遍歷

一.基本知識

1. 數學知識

(1)在二叉樹的第i層上最多有2^(i-1)個節點

(2)深度為k的二叉樹最多有2^(k)-1 個節點

(3)對任意二叉樹,若葉子節點數為n0,度(節點擁有子樹的個數)為2的節點數為n2,則 n0==n2+1

(4)對於具有n個節點的完全二叉樹,如果按照對滿二叉樹節點連續編號的方式,對所有節點從1開始順序編號,則對於任意序號為i的節點有:

  如果 i==1 ,則沒有雙親節點。i>1 ,則雙親節點(是同一個節點)的序號為“i/2”
  如果 2i <= n,則節點i的左孩子節點序號為 2i ,否則就沒有左孩子
  如果 2i + 1 <= n,則節點i的右孩子節點序號為 2i+1 ,否則就沒有右孩子

以上知識可以自己畫圖進行驗證,也可以自己進行數學論證(反正我是不會的了~_~)

二. 二叉樹的建立(二叉連結串列)

節點定義:

typedef struct Node {
    char data ;
    struct Node * Lchild ;
    struct Node * Rchild ;
} BiNode ;

1.先序建立:

(1)第一種方法

BiNode *CreteBitree()   //返回根節點
{
    BiNode *p;
    char ch ;
    cin >> ch ;
    if(ch  ==
'#') return NULL; else { p= (BiNode *)malloc(sizeof(BiNode)); p->data = ch ; p->Lchild=CreteBitree(); p->Rchild=CreteBitree(); } return p; //p is root }

(2)第二種方法

void CreteBitree(BiNode **root)  
{
    char ch ;
    cin >> ch ;
    if
( ch == '#' ) *root= NULL; else { *root = (BiNode *)malloc(sizeof(BiNode)); (*root)->data = ch; CreteBitree(&(*root)->Lchild); CreteBitree(&(*root)->Rchild); } }

三.二叉樹的遍歷

1.遞迴遍歷

void PreOrder(BiNode *root)    //  先序遍歷
{
    if(root)
    {
        cout << root->data ;
        PreOrder(root->Lchild);
        PreOrder(root->Rchild);
    }
}

void InOrder(BiNode  *root) //  中序遍歷
{
    if(root)
    {
        InOrder(root->Lchild);
        cout << root->data ;
        InOrder(root->Rchild);
    }
}
void PostOrder(BiNode *root) // 後序遍歷
{
    if(root)
    {
        PostOrder(root->Lchild);
        PostOrder(root->Rchild);
        cout << root->data ;
    }
}

完整程式碼:

#include<iostream>
using namespace std;

typedef struct Node {
    char data ;
    struct Node * Lchild ;
    struct Node * Rchild ;
} BiNode ;

void CreteBitree(BiNode **root)  
{
    char ch ;
    cin >> ch ;
    if( ch == '#' ) 
        *root= NULL;
    else {
        *root = (BiNode *)malloc(sizeof(BiNode));
        (*root)->data = ch;
        CreteBitree(&(*root)->Lchild);
        CreteBitree(&(*root)->Rchild);
    }
}

/*BiNode * CreteBitree()  
{
    BiNode *p;
    char ch ;
    cin >> ch ;
    if(ch  == '#') 
        return NULL;
    else {
        p= (BiNode *)malloc(sizeof(BiNode));
        p->data = ch  ;
        p->Lchild=CreteBitree();
        p->Rchild=CreteBitree();
    }
    return p; //p is root 
}*/

void PreOrder(BiNode *root)    //  先序遍歷
{
    if(root)
    {
        cout << root->data ;
        PreOrder(root->Lchild);
        PreOrder(root->Rchild);
    }
}

void InOrder(BiNode  *root) //  中序遍歷
{
    if(root)
    {
        InOrder(root->Lchild);
        cout << root->data ;
        InOrder(root->Rchild);
    }
}
void PostOrder(BiNode *root) // 後序遍歷
{
    if(root)
    {
        PostOrder(root->Lchild);
        PostOrder(root->Rchild);
        cout << root->data ;
    }
}
int main(void)
{
    BiNode *root;
    cout  << "Please input the  string :" << endl ;

    CreteBitree(&root);
//    root = CreteBitree();
    cout<< "遞迴!!!先序遍歷:" << endl ;
    PreOrder(root);
    cout << endl;
    cout<< "中序遍歷:" << endl ;
    InOrder(root);
    cout << endl;
    cout<< "後序遍歷:" << endl ;
    PostOrder(root);
    cout << endl ;
    return 0;
}

所建立的樹的形狀:

這裡寫圖片描述

執行結果:

這裡寫圖片描述

可以看到結果是正確的!!!

備註:以上的的程式碼均假設輸入了正確的字元,沒有進行錯誤處理。

下一篇將訴說二叉樹的非遞迴遍歷。

相關推薦

基本數學知識,建立

一.基本知識 1. 數學知識 (1)在二叉樹的第i層上最多有2^(i-1)個節點 (2)深度為k的二叉樹最多有2^(k)-1 個節點 (3)對任意二叉樹,若葉子節點數為n0,度(

Python --- 的層序建立

隊列 方式 span 等於 不存在 pos 同時 紅色 ret 二叉樹(Binary Tree)時數據結構中一個非常重要的結構,其具有。。。。(此處省略好多字)。。。。等的優良特點。 之前在刷LeetCode的時候把有關樹的題目全部跳過了,(ORZ:我這種連數據結構都不會的

二級指標實現的構造以具體程式碼實現

二級指標實現二叉樹的構造 首先二級指標作為函式引數的作用:在函式外部定義一個指標p,在函式內給指標賦值,函式結束後對指標p生效,那麼我們就需要二級指標。不懂沒有關係,繼續往下看~加油! 在如上的A指向B、B指向C的指向關係中,如果A、B、C都是變數,即C是普通變數,B是一級指標變數,其中存放

方式

    /**       *       * 遞迴先序遍歷       */     publicstaticvoid preOrderRec(Node root){           if(r

#include <stdio.h> #include <stdlib.h>#define elemTpye inttypedef struct BitNode{elemTpye data;struct BitNode *lchild,*rchild;

【資料結構】3-1 的先序建立操作

二叉樹真的令人頭大 #include<iostream> using namespace std; template <class T> struct BTNode//二叉連結串列結點結構 { T data; //二叉樹中的元素 BTNode<T>

(1)建立二叉樹二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

深度優先搜尋、廣度優先搜尋實現

二叉樹BFS,DFS遍歷及遞迴與非遞迴實現 #include<vector> #include<iostream> #include<queue> #include<stack> using namespace s

的先序、中序、後序基本操作c++實現

二叉樹:樹的每個節點最多有兩個子節點。1.實現二叉連結串列的結構://節點結構template<class T>struct  BinaryTreeNode{BinaryTreeNode<T>* _left;//左子樹BinaryTreeNode<

的前序、中序、後序叠代實現

pub public AC 實現 AR emp null ima sys 二叉樹的前序、中序、後序遍歷叠代實現 二叉樹的前序遍歷,叠代實現 根-左-右 思路: 1、 借用棧的結構 2、 先push(root) 3、 node = pop() 3.1、list.add( no

tree binary root sea inorder 遍歷二叉樹 二叉樹 struct != 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType

歸和非歸方式實現的先序、中序、後序

壓入 功能 指南 void 一個 兩個 方法 img oid 很久沒寫博客了,也很久沒有靜下心來學習技術,具體原因不再多糾結。 最近完成零丁任務之余每天刷一刷LeetCode,看看書(比如這篇記錄的是左程雲大佬的《程序員代碼面試指南》中的內容) 溫習和學習一些算法以及相關知

Java的前序、中序、後序

相信一直關注平時業務程式碼的同學都很少關注二叉樹、堆、棧等資料結構的訪問和遍歷。 今天我們就說說二叉樹的遍歷 什麼是前序遍歷?什麼是中序遍歷?什麼是後序遍歷?這個不懂的先自行百度一下吧。 二叉樹和連結串列的區別是,連結串列只有後序節點,二叉樹雖然沒有next節點,但是有左節點和右節點。

Leetcode 124 中的最大路徑和 (

給定一個非空二叉樹,返回其最大路徑和。 本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。 示例 1: 輸入: [1,2,3] 1 / \ 2 3 輸出: 6 示例 2:

郝斌資料結構入門--P67-的先序、中序、後序

郝斌資料結構入門--P67-二叉樹的先序、中序、後序遍歷   技巧:先、中、後序,是針對訪問根節點的位置來定義的。先序,先訪問根。中序,中間訪問根。後序,最後訪問根。   二叉樹的遍歷 (數是一個非線性的,通過先序、中序、後序遍歷把非線性的儲存線性的硬體上)

的前序,中序,後序。用和非實現

#include<iostream> #include<stack> using namespace std; #define MAX 100 typedef struct Tree{ int data; Tree*lchild; Tree*rchild; }

連結串列儲存的進行先序、中序和後序的演算法

用二叉樹連結串列作為儲存結構,完成二叉樹的建立,先序、中序和後序以及按層次遍歷的操作,求所有葉子及結點總數的操作 #include<iostream>   #include<cstdio>   #include<stdlib.h&

Java資料結構:的前序,中序,後序和非

嚶嚶嚶,兩個月沒寫部落格了,由於有點忙,今天開始日更部落格。 今天總結一下學習樹的先根,中根,後根。每種兩種方法,遞迴和非遞迴。 先根: 遞迴: 思路:先根遍歷,即第一次遇到的結點就開始列印。先一直遍歷左子樹,直到未空,然後右子樹,直到為空。遞迴下去。 過程:先將1進入方法

[每日leetcode]的前序、中序、後序

二叉樹的前序遍歷 給定一個二叉樹,返回它的 前序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,2,3] 進階: 遞迴演算法很

Leetcode---的序列化與反序列化--

二叉樹的序列化與反序列化 題目連結:二叉樹的序列化與反序列化 思路: 這道題。。。真是讓我處理了很久啊。 我的第一思路有兩個,1.二叉樹的層次遍歷,再反序列化構造,這裡就要求將二叉樹當做完全二叉樹遍歷,空節點用“#”代替。第二個就是下面的錯誤思路。。。 錯誤思