第5章 遍历二叉树【递归遍历】
一开始本姑娘想来一波神奇的操作让二叉树甘拜于我的键盘之下,然鹅发现,我去,二叉树原来这么奇葩。
然后呢,本姑娘就下定决心从简单的开始写,我就不信,指针都被我啃下来了,二叉树我还搞不定你,哼~
#include<stdio.h> #include<malloc.h> #include<iostream> #include<string.h> using namespace std; #define MAXSIZE 1000 typedef char TElemType; //------------二叉树的二叉链表存储表示---------- typedef struct BiTNode{ TElemType data;//结点数据域 struct BiTNode *lchild,*rhild;//左右孩子指针 }BiTNode,*BiTree; void CreateBiTree(BiTree &T) { char ch; cin>>ch; if(ch == '#')//递归结束建空树 { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode));//生成根节点 T->data = ch;//根节点的数据域置为空 CreateBiTree(T->lchild );//递归创建左子树 CreateBiTree(T->rhild);//递归创建右子树 } return ; } void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法 { if(T)//若二叉树非空 { cout<<T->data ;//访问根节点 PreOrderTraverse(T->lchild );//先序遍历左子树 PreOrderTraverse(T->rhild );//先序遍历右子树 } return; } void InOrderTraverse(BiTree T)//中序遍历二叉树的递归算法 { if(T)//若二叉树非空 { InOrderTraverse(T->lchild );//中序遍历左子树 cout<<T->data ;//访问根节点 InOrderTraverse(T->rhild );//中序遍历右子树 } } void PostOrderTraverse(BiTree T) { if(T)//若二叉树非空 { PostOrderTraverse(T->lchild );//后序遍历左子树 PostOrderTraverse(T->rhild );//后序遍历右子树 cout<<T->data ;//访问根节点 } } void Copy(BiTree T,BiTree &NewT)//二叉树复制 ,复制一棵和T完全相同的二叉树 { if(T == NULL)// 如果是空树,递归结束 { NewT = NULL; return; } else { NewT = (BiTree)malloc(sizeof(BiTNode)); NewT->data = T->data ;//复制根节点 Copy(T->lchild ,NewT->lchild );//递归复制左子树 Copy(T->rhild ,NewT->rhild );//递归复制右子树 } return; } int Depth(BiTree T)//计算二叉树的深度 { if(T==NULL)//如果是空树,深度为0,递归结束 return 0; else { int m = Depth(T->lchild );//递归计算左子树的深度m int n = Depth(T->rhild );//递归计算右子树的深度n if( m > n)//二叉树的深度为m与n的较大者加1 return (m+1); return (n+1); } } int NodeCount(BiTree T)//统计二叉树结点个数 { if(T== NULL)//如果二叉树为空,结点个数为0 return 0; else { return NodeCount(T->lchild )+NodeCount(T->rhild )+1;//左子树结点个数+右子树结点个数+1 } } int main() { BiTree T,NewT; printf("请按照先序遍历的顺序建立二叉树\n"); CreateBiTree(T); printf("先序遍历输出为\n"); PreOrderTraverse(T); printf("\n"); printf("中序遍历输出为\n"); InOrderTraverse(T); printf("\n"); printf("后序遍历输出为\n"); PostOrderTraverse(T); printf("\n"); Copy(T,NewT); printf("复制后的二叉树中序遍历输出为\n"); InOrderTraverse(NewT); printf("\n"); printf("结点的深度为%d\n",Depth(T)) ; printf("结点的个数为%d\n",NodeCount(T)); return 0; }