日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之二叉树基本操作

發(fā)布時間:2024/3/7 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之二叉树基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,二叉樹的定義:

typedef struct node {int data;struct node *lchild;struct node *rchild; }Node;typedef struct { //樹根Node* root; } Tree;

注:二叉樹創(chuàng)建為什么要用二級指針???
調用者的變量需要被修改內容,這里是root(指向Tree類型的指針),Tree需要指向一個新插入的節(jié)點,也就是需要修改root的值。所以 應該傳入指向root的地址。這樣在被調用的函數中,對Tree的操作等價于操作root。否則Tree如果是和root類型一樣的Node類型 的指針,和root位于兩個不同的內存,Tree只是被初始化為root的值,之后對Node的操作不會影響root。

2,二叉樹的創(chuàng)建

void insert(Tree* tree, int value)//創(chuàng)建樹 {//node尾插入節(jié)點Tree* node=(Tree*)malloc(sizeof(Tree));//創(chuàng)建一個節(jié)點node->data = value;node->left = NULL;node->right = NULL;if (tree->root == NULL)//判斷樹是不是空樹{tree->root = node;}else {//不是空樹Node* temp = tree->root;//從樹根開始while (temp != NULL){if (value < temp->data)//小于就進左兒子{if (temp->left == NULL){temp->left = node;return;}else {//繼續(xù)判斷temp = temp->left;}}else {//否則進右兒子if (temp->right == NULL){temp->right = node;return;}else {//繼續(xù)判斷temp = temp->right;}}}}return; }

3,二叉樹的遍歷

//中序 void InOrderTree(Tree root) {if (root == NULL) {return;}InOrderTree(root->left);printf("%d ", root->data);InOrderTree(root->right); }//先序 void PreOrderTree(Tree root) {if (root == NULL) {return;}printf("%d ", root->data);PreOrderTree(root->left);PreOrderTree(root->right); }//后序 void PostOrderTree(Tree root) {if (root == NULL) {return;}PostOrderTree(root->left);PostOrderTree(root->right);printf("%d ", root->data); }

4,二叉樹關鍵字的查找

//非遞歸Tree SearchBSTree( Tree pBST,int key) //版本1{while(NULL != pBST && key != pBST ->data){ if(key < pBST ->data)pBST = pBST ->pLchild;elsepBST = pBST ->pRchild ;} return pBST;}//遞歸 Tree SearchBSTree(Tree pBST,int key) //版本2{if(NULL == pBST) return NULL;else if(key < pBST ->data) return SearchBSTree(pBST ->pLchild,key);else if(key > pBST ->data)return SearchBSTree(pBST ->pRchild,key);elsereturn pBST; }

5,二叉樹的深度

int maxDepth(Tree root) {if (root == NULL) {return 0;}else {int maxLeft = maxDepth(root->left);int maxRight = maxDepth(root->right);if (maxLeft > maxRight) {return 1 + maxLeft;}else {return 1 + maxRight;}} }

6,二叉樹節(jié)點的刪除

void DeleteBynum(Tree bt,int key) {Tree L,LL; //在刪除左右子樹都有的結點時使用;Tree p=bt;Tree parent=bt;int child=0; //0表示左子樹,1表示右子樹;if(!bt) //如果排序樹為空,則退出;return ;while(p) //二叉排序樹有效;{//1,葉結點(左右子樹都為空);if(p->data==key){if(!p->lchild&&!p->rchild) {if(p==bt) //被刪除的結點只有根結點;free(p);else if(child==0){parent->lchild=NULL; //設置父結點左子樹為空;free(p); //釋放結點空間;}else //父結點為右子樹;{parent->rchild=NULL; //設置父結點右子樹為空;free(p); //釋放結點空間;}}//2,左子樹為空,右子樹不為空;else if(!p->lchild) {if(child==0) //是父結點的左子樹;parent->lchild=p->rchild;else //是父結點的右子樹;parent->rchild=p->rchild;free(p); //釋放被刪除的結點;}//3,右子樹為空,左子樹不為空;else if(!p->rchild) {if(child==0) //是父結點的左子樹;parent->lchild=p->lchild;else //是父結點的右子樹;parent->rchild=p->lchild;free(p); //釋放被刪除的結點;}//4,左右子樹都不為空else{LL=p; //保存左子樹的結點;L=p->rchild; //從當前結點的右子樹進行查找;if(L->lchild) //左子樹不為空;{LL=L;L=L->lchild; //查找左子樹;p->data=L->data; //將左子樹的數據保存到被刪除結點;LL->lchild=L->lchild; //設置父結點的左子樹指針為空;for(;L->lchild;L=L->lchild);L->lchild=p->lchild;p->lchild=NULL;}else{p->data=L->data;LL->rchild=L->rchild;}}p=NULL;}else if(key<p->data) //需刪除記錄的關鍵字小于結點的數據;{//要刪除的結點p是parent的左子樹;child=0; //標記在當前結點左子樹;parent=p;//保存當前結點作為父結點;p=p->lchild; //查找左子樹;}else //需刪除記錄的關鍵字大于結點的數據;{//要刪除的結點p是parent的右子樹;child=1; //標記在當前結點右子樹查找;parent=p; //保存當前結點作為父結點;p=p->rchild; //查找右子樹;}} }

7,葉子節(jié)點個數統(tǒng)計

int LeafNodeNum(t Tree root) {if (root == NULL) {return 0;}if (root->left == NULL&&root->right == NULL) {return 1;}else {return LeafNodeNum(root->left) + LeafNodeNum(root->right);}

總結

以上是生活随笔為你收集整理的数据结构之二叉树基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。