数据结构之二叉树基本操作
生活随笔
收集整理的這篇文章主要介紹了
数据结构之二叉树基本操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,二叉樹的定義:
typedef struct node {int data;struct node *lchild;struct node *rchild; }Node;typedef struct { //樹根Node* root; } Tree;注:二叉樹創建為什么要用二級指針???
調用者的變量需要被修改內容,這里是root(指向Tree類型的指針),Tree需要指向一個新插入的節點,也就是需要修改root的值。所以 應該傳入指向root的地址。這樣在被調用的函數中,對Tree的操作等價于操作root。否則Tree如果是和root類型一樣的Node類型 的指針,和root位于兩個不同的內存,Tree只是被初始化為root的值,之后對Node的操作不會影響root。
2,二叉樹的創建
void insert(Tree* tree, int value)//創建樹 {//node尾插入節點Tree* node=(Tree*)malloc(sizeof(Tree));//創建一個節點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 {//繼續判斷temp = temp->left;}}else {//否則進右兒子if (temp->right == NULL){temp->right = node;return;}else {//繼續判斷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,二叉樹節點的刪除
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,葉子節點個數統計
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);}總結
以上是生活随笔為你收集整理的数据结构之二叉树基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1×pbs缓冲液配方_【pbs缓冲液配制
- 下一篇: 分析电路中三极管的作用 (入门)