第5章 遍历二叉树【递归遍历】
来源:互联网 发布:淘宝卖东西提成怎么算 编辑:程序博客网 时间:2024/05/22 03:02
一开始本姑娘想来一波神奇的操作让二叉树甘拜于我的键盘之下,然鹅发现,我去,二叉树原来这么奇葩。
然后呢,本姑娘就下定决心从简单的开始写,我就不信,指针都被我啃下来了,二叉树我还搞不定你,哼~
#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;}
一开始本姑娘想来一波神奇的操作让二叉树甘拜于我的键盘之下,然鹅发现,我去,二叉树原来这么奇葩。
然后呢,本姑娘就下定决心从简单的开始写,我就不信,指针都被我啃下来了,二叉树我还搞不定你,哼~
#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;}
阅读全文
0 0
- 第5章 遍历二叉树【递归遍历】
- 二叉树递归遍历
- 二叉树遍历(递归)
- 二叉树递归遍历
- 递归遍历二叉树
- 递归二叉树遍历
- 二叉树递归遍历
- 递归遍历二叉树
- 二叉树递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 遍历二叉树——递归遍历
- 二叉树的遍历(递归遍历)
- 二叉树的递归遍历
- 非递归遍历二叉树
- 二叉树遍历非递归
- 后序非递归遍历二叉树
- 非递归遍历二叉树
- 二叉树非递归遍历
- think of java 阅读之String
- (3)spring获取资源的类及获取bean的方法
- http tcp/IP协议与 socket 的区别
- 个人理解总结之抽象工厂模式
- git ——回退过去、回到未来
- 第5章 遍历二叉树【递归遍历】
- js 验证码 倒计时60秒
- SQL Server 2017 安装AdventureWorks示例数据库出现的问题
- regex C++正则表达式简单使用
- UVA 12626 I ❤ Pizza
- action里获取表单数据的三种方式
- 安装nodejs和npm以后出现 /usr/bin/env: node: No such file or directory
- 1045. 快速排序(25)
- spring MVC视图解析器