概念和性質
樹的相關概念和性質
二叉樹的相關概念和性質
遞歸實現二叉樹的創建和遍歷
代碼
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode *Lchild;
struct TreeNode *Rchild;
} TreeNode,*P_TreeNode;
//創建樹(前序遍歷創建樹,輸入:AB#D##C##)
void createTree(P_TreeNode &T) {
char data;
scanf("%c",&data);
if(data == '#'){
T = NULL;
return ;
}else{
T = (P_TreeNode)malloc(sizeof(TreeNode));
if(T == NULL){
printf("創建失敗!\n");
exit(-1);
}
T->data = data;
createTree(T->Lchild);//遞歸創建左子樹
createTree(T->Rchild);//遞歸創建右子樹
}
}
//先序遍歷
void preOrderTraversal(P_TreeNode T){
if(T == NULL){
return ;
}
printf("%3c",T->data);
preOrderTraversal(T->Lchild);
preOrderTraversal(T->Rchild);
}
//中序遍歷
void mediumOrderTraversal(P_TreeNode T){
if(T == NULL){
return;
}
mediumOrderTraversal(T->Lchild);
printf("%3c",T->data);
mediumOrderTraversal(T->Rchild);
}
//後序遍歷
void afterOrderTraversal(P_TreeNode T){
if(T == NULL){
return;
}
afterOrderTraversal(T->Lchild);
afterOrderTraversal(T->Rchild);
printf("%3c",T->data);
}
int main(){
P_TreeNode T;
createTree(T);
printf("\n先序遍歷:");
preOrderTraversal(T);
printf("\n中序遍歷:");
mediumOrderTraversal(T);
printf("\n後序遍歷:");
afterOrderTraversal(T);
printf("\n");
return 0;
}
執行結果
非遞歸實現二叉樹的創建和遍歷
代碼
#include<stdio.h>
#include<stdlib.h>
#include <stack> //需要引入棧文件
using namespace std;//同時要設置命名空間
//定義樹結構
typedef struct Node{
char data;
struct Node *lchild;
struct Node *rchild;
}Node,*Tree;
//創建樹:ABD##E##CF####
void createTree(Tree &T){
char data;
scanf("%c",&data);
if(data == '#'){
T = NULL;
}else{
T = (Node*)malloc(sizeof(Node));
if(T == NULL){
printf("創建樹失敗!\n");
return;
}
T->data = data;
createTree(T->lchild);
createTree(T->rchild);
}
}
//非遞歸先序遍歷
void preOrderTraversal(Tree T){
stack<Tree> Stack;
while(T || !Stack.empty()){//直到當前節點爲NULL且棧空時,循環結束
while(T){
printf("%3c",T->data);//從根節點開始,輸出當前節點,
Stack.push(T); //並將其入棧
T = T->lchild;//同時置其左孩子爲當前節點,直至其沒有左孩子,即當前節點爲NULL
}
T = Stack.top();//獲取棧頂
Stack.pop();//將棧頂節點出棧
T = T->rchild;//同時置其右孩子爲當前節點,循環判斷,直至T不爲空
}
}
//非遞歸中序遍歷
void mediumOrderTraversal(Tree T){
stack<Tree> Stack;
while(T || !Stack.empty()){//直到當前節點爲NULL且棧空時,循環結束
while(T){
Stack.push(T);//入棧
T = T->lchild;//同時置其左孩子爲當前節點,直至其沒有左孩子,即當前節點爲NULL
}
T = Stack.top();//獲取當前棧頂
Stack.pop();//將棧頂出棧
printf("%3c",T->data);//輸出當前節點
T = T->rchild;//同時置其右孩子爲當前節點,循環判斷,直至T不爲空
}
}
//非遞歸後序遍歷
void afterOrderTraversal(Tree T){
stack<Tree> Stack;
Tree pCur; //定義指針,指向當前節點
Tree pPre = NULL;//定義指針,指向上一各訪問的節點
Stack.push(T);
while(!Stack.empty()){
pCur = Stack.top();
//如果當前節點沒有左右孩子,或者有左孩子或有孩子,但已經被訪問輸出,
//則直接輸出該節點,將其出棧,將其設爲上一個訪問的節點
if((pCur->lchild==NULL && pCur->rchild == NULL) ||
(pPre != NULL && (pCur->lchild==pPre || pCur->rchild == pPre))){
printf("%3c",pCur->data);
Stack.pop();
pPre = pCur;
}else{
//如果不滿足上面兩種情況,則將其右孩子左孩子依次入棧
if(pCur->rchild != NULL)
Stack.push(pCur->rchild);
if(pCur->lchild != NULL)
Stack.push(pCur->lchild);
}
}
}
int main(){
Tree T;
printf("創建樹:(ABD##E##CF####回車)\n");
createTree(T);
printf("非遞歸先序遍歷:");
preOrderTraversal(T);
printf("\n非遞歸中序遍歷:");
mediumOrderTraversal(T);
printf("\n非遞歸後序遍歷:");
afterOrderTraversal(T);
printf("\n");
printf("\n");
return 0;
}
執行結果
參考網址:
http://blog.csdn.net/pi9nc/article/details/13008511
http://blog.csdn.net/cxllyg/article/details/7520037