二叉樹的一些東西

2021-09-12 12:24:11 字數 2911 閱讀 6260

了解完全二叉樹和滿二叉樹

滿二叉樹:

除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點(最後一層上的無子結點的結點 為葉子結點)。也可以這樣理解,除葉子結點外的所有結點均有兩個子結點。節點數達到最大值。所有葉子結點必須在同一層上。

完全二叉樹:

若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

前序中序後序遍歷

同時知道中序遍歷和其他另一種遍歷才能知道樹的結構

二叉搜尋樹

題:判斷兩序列是否為乙個二叉搜尋樹序列

/*

二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:

若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

查詢演算法:

在二叉排序樹b中查詢x的過程為:

若b是空樹,則搜尋失敗,

否則:若x等於b的根結點的資料域之值,則查詢成功;

否則:若x小於b的根結點的資料域之值,則搜尋左子樹;

否則:查詢右子樹。

插入演算法:

向乙個二叉排序樹b中插入乙個結點s的演算法,過程為:

若b是空樹,則將s所指結點作為根結點插入,否則:

若s->data等於b的根結點的資料域之值,則返回,否則:

若s->data小於b的根結點的資料域之值,則把s所指結點插入到左子樹中,否則:

把s所指結點插入到右子樹中。

*/// 對輸入的數字序列構建二叉排序樹,並對他們進行前序和中序的遍歷,依次比較兩次遍歷的結果是否相同,

// 相同則說明兩棵二叉排序樹相同

#include #include #include #include #include using namespace std;

struct node

tree[110];

int loc;

//申請節點空間

node *create()

//儲存二叉樹遍歷結果,將每一棵樹的前序遍歷得到的字串與中序遍歷得到的字串連線,得到遍歷結果的字串

char str1[110], str2[110];

int size1, size2; //儲存在字串陣列中的遍歷得到的字元個數

char *str; //當前正在儲存的字串

node *insert(node *t, int x)

else if (x < t->c)

else if (x> t->c) }

void postorder(node *t)

if (t -> rchild != null)

str[size1++] = t->c + '0';

}void inorder(node *t)

str[size2++] = t->c + '0';

if (t->rchild != null) }

int main()

size1 = 0;

str = str1; //將正在儲存的字串設定為第乙個字串

postorder(t);

inorder(t);

str1[size1] = 0; //像第乙個字串最後乙個字元後新增空字元,方便子使用字串函式

while (n--)

size2 = 0;

str = str2;

postorder(t2);

inorder(t2);

str2[size2] = 0;

puts(strcmp(str1, str2) == 0 ? "yes" : "no");

} }return 0;

}

二叉排序樹,

建立二叉排序樹,並進行前中後序排列

/*

二叉排序樹:對於樹上任意乙個節點,其上的數值必須大於等於其左子樹上任意節點數值,小於等於其右子樹上任意節點的數值

*/#include#includeusing namespace std;

//二叉樹結構體

struct node

tree[100];

int loc; //靜態陣列中被使用的元素的個數

//申請未使用的節點

node *create()

//插入數字,x為要插入的數字

node *insert(node *t, int x)

else if (x < t->c) //如果小於當前根節點數值

else if (x > t->c) //如果大於當前根節點數值

//如果存在相同大小的數字,直接不管忽略

return t;

}//後序遍歷

void postorder(node *t)

if (t->rchild != null)

printf("%d ", t->c);

}//中序遍歷

void inorder(node *t)

printf("%d ", t->c);

if (t->rchild != null)

}//前序遍歷

void preorder(node *t)

if (t->rchild != null) }

int main()

preorder(t);

printf("\n");

inorder(t);

printf("\n");

postorder(t);

printf("\n");

} return 0;

}

二叉樹的一些概念

1 滿二叉樹 樹內的任何結點,或為樹葉 圖1中2689 或有兩個非空子樹。滿二叉樹定理 非空滿二叉樹樹葉的數目等於其分支結點數目加1。此外,乙個二叉樹第i層 根節點為0層 最多能有2的i次方個結點。圖12 平衡二叉樹 如果樹中任何結點的兩個子樹高度差是0或者1。對於圖1來說結點1左子樹高度為1,右子...

二叉樹的一些操作

標頭檔案 樹.h pragma once include include include include include include typedef char datatype typedef struct btnodebtnode btnode greattree datatype pre,i...

二叉樹的一些操作

1 include 2 include 3 4 typedef struct binodebinode,bitree 910 void createbitree bitree t 建立二叉樹 11int gettreeheight bitree t 返回二叉樹高度 12int getallnode ...