1. 程式人生 > >二叉樹的模板 先序建立 二叉樹的遍歷 深度

二叉樹的模板 先序建立 二叉樹的遍歷 深度

先序遍歷 個數 iostream 葉子節點個數 pop level else 二叉樹的層次遍歷 num

關於二叉樹,基本操作都是在遞歸的基礎上完成的,二叉樹的層次遍歷是隊列實現。具體解釋看代碼

#include<iostream>
#include<stack>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//二叉樹結點
typedef struct BiTNode
{
    //數據
    char data;
    //左右孩子指針
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
//重命名 將struct BiTNode命名為BiTNode,將struct BiTNode*命名為BiTree //按先序序列創建二叉樹 int CreateBiTree(BiTree &T)//引用 { char data; //按先序次序輸入二叉樹中結點的值(一個字符),‘#’表示空樹 scanf("%c",&data); if(data == #) { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode)); //生成根結點
T->data = data; //構造左子樹 CreateBiTree(T->lchild); //構造右子樹 CreateBiTree(T->rchild); } return 0; } //輸出 void Visit(BiTree T) { if(T->data != #) { printf("%c ",T->data); } } //先序遍歷 void PreOrder(BiTree T) { if(T != NULL) {
//訪問根節點 Visit(T); //訪問左子結點 PreOrder(T->lchild); //訪問右子結點 PreOrder(T->rchild); } } //中序遍歷 void InOrder(BiTree T) { if(T != NULL) { //訪問左子結點 InOrder(T->lchild); //訪問根節點 Visit(T); //訪問右子結點 InOrder(T->rchild); } } //後序遍歷 void PostOrder(BiTree T) { if(T != NULL) { //訪問左子結點 PostOrder(T->lchild); //訪問右子結點 PostOrder(T->rchild); //訪問根節點 Visit(T); } } //層次遍歷 void LevelOrder(BiTree T) { BiTree p = T; //隊列 queue<BiTree> queue; //根節點入隊 queue.push(p); //隊列不空循環 while(!queue.empty()) { //對頭元素出隊 p = queue.front(); //訪問p指向的結點 printf("%c ",p->data); //退出隊列 queue.pop(); //左子樹不空,將左子樹入隊 if(p->lchild != NULL) { queue.push(p->lchild); } //右子樹不空,將右子樹入隊 if(p->rchild != NULL) { queue.push(p->rchild); } } } //葉子節點個數 int TreeCount(BiTree T) { if(T == NULL) { return 0; } else if ((T->lchild==NULL) && (T->rchild==NULL)) { return 1;//如果此節點是葉子節點,返回1 即它本身是一個節點。 } else { return TreeCount(T->lchild)+TreeCount(T->rchild);//如果左右孩子不空,返回左孩子+右孩子節點數。 } } //求深度 int TreeDepth(BiTree T) { int rightdep=0; int leftdep=0;   //如果是空樹,返回-1 if(T==NULL) return -1;   //如果左孩子不空,繼續遞歸,如果為空,返回-1 if(T->lchild!=NULL) leftdep=TreeDepth(T->lchild); else leftdep=-1; //如果右孩子不空,繼續遞歸,如果為空,返回-1 if(T->rchild!=NULL) rightdep=TreeDepth(T->rchild); else rightdep=-1;   //左右孩子都遞歸完,返回左右孩子中較大的值 return (rightdep>leftdep) ? rightdep+1 : leftdep+1; } //交換左右孩子 void TreeExchange(BiTree T) { if(T!=NULL) { BiTree temp; if(T->lchild||T->rchild) { temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; TreeExchange(T->lchild); TreeExchange(T->rchild); } } } int main() { BiTree T; CreateBiTree(T); printf("先序遍歷:\n"); PreOrder(T); printf("\n\n"); printf("中序遍歷:\n"); InOrder(T); printf("\n\n"); printf("後序遍歷:\n"); PostOrder(T); printf("\n\n"); printf("層次遍歷:\n"); LevelOrder(T); printf("\n\n"); int deep=TreeDepth(T); printf("樹的深度:%d\n\n",deep+1); int number=TreeCount(T); printf("葉子節點個數:%d\n\n",number); printf("交換左右孩子成功\n\n"); TreeExchange(T); printf("層次遍歷:\n"); LevelOrder(T); printf("\n"); printf("\n"); return 0; }

二叉樹的模板 先序建立 二叉樹的遍歷 深度