二叉樹的基本操作:"二叉樹基本操作.cpp"
首先定義二叉鏈式結構:
#include #include #define queue_maxsize 50 //佇列大小
typedef char data; //定義元素型別
typedef struct chaintree
chainbintree;
然後對乙個二叉樹進行初始化,即將已有的乙個結點設定為二叉樹根結點
chainbintree *bintreeinit(chainbintree *node) //初始化二叉樹根結點
node為乙個二叉樹結點的指標,若node結點不空,返回該結點指標的值作為二叉樹的根結點
新增結點到二叉樹:
int bintreeaddnode(chainbintree *bt,chainbintree *node,int n) //新增結點
//bt為父結點,node為子結點,n=1表示新增到左子樹,n=2表示新增到右子樹
switch(n)
else //父結點bt的左子樹為空,將結點node新增到左子樹
bt->left=node;
break;
case 2:
if(bt->right) //右子樹不為空
else
bt->right=node; //結點node新增到右子樹
break;
default:
printf("引數錯誤\n");
return 0;
}return 1; //1表示新增成功
}
獲取二叉樹的左右子樹:
chainbintree *bintreeleft(chainbintree *bt) //返回左子結點
chainbintree *bintreeright(chainbintree *bt) //返回右子結點
計算樹的深度
int bintreedepth(chainbintree *bt) //求二叉樹深度
}
在二叉樹中查詢,需要遍歷二叉樹的每乙個結點,逐個比較資料,當找到目標資料時,返回資料所在的結點指標
chainbintree *bintreefind(chainbintree *bt,data data); //在二叉樹中找值為data的結點
}}
清空二叉樹:在向二叉樹新增結點時,每個結點都是由malloc函式申請分配記憶體,清空時用free釋放
void bintreeclear(chainbintree *bt) //清空二叉樹,
return;
}
二叉樹的遍歷:
遍歷是對二叉樹的基本操作,所謂遍歷二叉樹就是按照一定規則和順序走遍二叉樹所有子樹,使每乙個結點都被訪問一次
遍歷有四種方法:先序遍歷,中序遍歷,後序遍歷,按層遍歷。
對下圖:d(data)表示根節點,l(left)表示左子樹,r(right)表示右子樹
先序遍歷(dlr):先訪問根節點,在按先序遍歷左子樹,最後按先序遍歷右子樹
中序遍歷(ldr):先按中序遍歷左子樹,再訪問根結點,最後按中序遍歷右結點
後序遍歷(lrd):先後序遍歷左子樹,再後序遍歷右子樹,最後再訪問根結點
先序遍歷:
//先序遍歷
void bintree_dlr(bintree)
return; //遞迴結束
}
bt為需要遍歷的根結點,函式oper是乙個需要對結點進行操作的函式。
中序遍歷:
//中序遍歷
void bintree_ldr(bintree)
return;
}
後序遍歷:
//後序遍歷
void bintree_lrd(bintree)
return;
}
對下圖:
先序遍歷後各結點順序:a,b,d,h,i,e,j,k,c,f,l,g。
中序遍歷後各節點順序:h,d,i,b,j,e,k,a,l,f,c,g
後序遍歷後各結點順序:h,i,d,j,k,e,b,l,f,g,c,a
按層遍序:對上面所示的二叉樹,共有四層,按層遍歷得到的順序就是:a,b,c,d,e,f,g,h,i,j,k,l
由於二叉樹按層遍歷,使用迴圈佇列進行處理,實現逐層遍歷:
//按層遍歷
void bintree_level(chainbintree *bt,void (*oper)(chainbintree *p))
while(head!=tail) //佇列不為空,進行迴圈
if(p->right!=null) //結點有右子樹;右子樹指標進隊
} return;
}
首先從根結點開始,每層的結點逐步進入佇列,這樣就可得到按層遍歷的效果。
#include
#include#include "二叉樹基本操作.cpp"
void oper(chainbintree *p) //操作二叉樹結點的資料
chainbintree *initroot() //建立二叉樹根結點
return null;
}void addnode(chainbintree *bt) //給二叉樹新增子結點
printf(1.新增到左子樹\n 2.新增到右子樹\n);
dowhile(select!=1&&select!=2); }
return;
} int main()
}while(select!='0');
bintreeclear(root); //清空二叉樹
root=null;
return 0;
}
二叉樹四種遍歷方式
二叉樹的四種遍歷方式 include include using namespace std 二叉樹節點的定義 class treenode 遞迴方式,每個結點只遍歷一次,時間複雜度o 1 遞迴最多呼叫n次,空間複雜度o n 先序 根 遞迴左 遞迴右 void preorder treenode r...
二叉樹的四種遍歷方式
前言最近做題用到很多次二叉樹的遍歷,因此寫這篇文章記錄二叉樹的四種遍歷方式。首先為了方便,先假設二叉樹的結構如下 struct treenode 對於程式的輸入為 3 根節點root 9 20 4 10 15 71.二叉樹的層次遍歷 層次遍歷就是依次遍歷樹的每一層。借助佇列,可以輕鬆實現。void ...
二叉樹的四種遍歷方式
二叉樹是一種很常見的資料結構,其結構如下圖 下面接受他的四種遍歷方式 前提 這裡先給出測試中的二叉樹結構,如下圖所示 該二叉樹對應的幾種遍歷方式的結果順序 先序遍歷 10 6 4 8 14 12 16 中序遍歷 4 6 8 10 12 14 16 後序遍歷 4 8 6 12 16 14 10 層次遍...