二叉树的遍历
1、递归实现二叉树的建立和递归实现遍历
//算法5.1 中序遍历的递归算法 #include<iostream> using namespace std; typedef struct BiNode{ //二叉链表定义 char data; struct BiNode *lchild,*rchild; }BiTNode,*BiTree; //用算法5.3 先序遍历的顺序建立二叉链表 void CreateBiTree(BiTree &T){ //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T char ch; cin >> ch; if(ch=='#') T=NULL; //递归结束,建空树 else{ T=new BiTNode; T->data=ch; //生成根结点 CreateBiTree(T->lchild); //递归创建左子树 CreateBiTree(T->rchild); //递归创建右子树 } //else } //CreateBiTree void InOrderTraverse(BiTree T){ //中序遍历二叉树T的递归算法 if(T){ InOrderTraverse(T->lchild); cout << T->data; InOrderTraverse(T->rchild); } } int main(){ BiTree tree; cout<<"请输入建立二叉链表的序列:\n"; CreateBiTree(tree); cout<<"中序遍历的结果为:\n"; InOrderTraverse(tree); cout<<endl; return 0; }
先序建立二叉树:ABD#G##EH###CF###
//算法5.2 中序遍历的非递归算法 求栈的长度就可以得出树的高度 #include<iostream> using namespace std; //二叉树的二叉链表存储表示 typedef struct BiNode { char data; //结点数据域 struct BiNode *lchild,*rchild; //左右孩子指针 }BiTNode,*BiTree; //链栈的定义 typedef struct StackNode { BiTNode data; struct StackNode *next; }StackNode,*LinkStack; //用算法5.3 先序遍历的顺序建立二叉链表 void CreateBiTree(BiTree &T) { //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T char ch; cin >> ch; if(ch=='#') T=NULL; //递归结束,建空树 else{ T=new BiTNode; T->data=ch; //生成根结点 CreateBiTree(T->lchild); //递归创建左子树 CreateBiTree(T->rchild); //递归创建右子树 } //else } //CreateBiTree void InitStack(LinkStack &S) { //构造一个空栈S,栈顶指针置空 S=NULL; } bool StackEmpty(LinkStack S) { if(!S) return true; return false; } void Push(LinkStack &S,BiTree e) { //在栈顶插入元素*e StackNode *p=new StackNode; p->data=*e; p->next=S; S=p; } void Pop(LinkStack &S,BiTree e) { if(S!=NULL)//原书上写的是if(S==NULL)return ERROR; { *e=S->data; StackNode *p=S; S=S->next; delete p; } } void InOrderTraverse1(BiTree T) { // 中序遍历二叉树T的非递归算法 LinkStack S; BiTree p; BiTree q=new BiTNode; InitStack(S); p=T; while(p||!StackEmpty(S)) { if(p) { Push(S,p); //p非空根指针进栈,遍历左子树 p=p->lchild; } else { Pop(S,q); //p为空根指针退栈,访问根结点,遍历右子树 cout<<q->data; p=q->rchild; } } // while } // InOrderTraverse int main() { BiTree tree; cout<<"请输入建立二叉链表的序列:\n"; CreateBiTree(tree); cout<<"中序遍历的结果为:\n"; InOrderTraverse1(tree); cout<<endl; }
//算法5.3 先序遍历的的顺序建立二叉链表 #include<iostream> using namespace std; //二叉树的二叉链表存储表示 typedef struct BiNode { char data; //结点数据域 struct BiNode *lchild,*rchild; //左右孩子指针 }BiTNode,*BiTree; void CreateBiTree(BiTree &T) { //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T char ch; cin >> ch; if(ch=='#') T=NULL; //递归结束,建空树 else{ T=new BiTNode; T->data=ch; //生成根结点 CreateBiTree(T->lchild); //递归创建左子树 CreateBiTree(T->rchild); //递归创建右子树 } //else } //CreateBiTree //用算法5.1 中序遍历的递归算法 void InOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 if(T){ InOrderTraverse(T->lchild); cout << T->data; InOrderTraverse(T->rchild); } } int main() { BiTree tree; cout<<"请输入建立二叉链表的序列:\n"; CreateBiTree(tree); cout<<"所建立的二叉链表中序序列:\n"; InOrderTraverse(tree); cout<<endl; }
二、递归实现先序、中序、后续遍历
#include<iostream.h> #include<stdio.h> #include<stdlib.h> typedef struct BTree{ char date; struct BTree *lchild,*rchild; }BTree,* BiTree; BiTree intit(); //函数先序遍历 void out(BiTree); //先序输出 void outZ(BiTree); //中序输出 void outL(BiTree); //后序输出 int main(){ BiTree root; root=intit(); //out(root); //outZ(root); outL(root); cout<<endl; return 0; } void outL(BiTree root){ //后序输出 if(root){ out(root->lchild); out(root->rchild); printf("%c",root->date); } } void outZ(BiTree root){ //中序输出 if(root){ out(root->lchild); printf("%c",root->date); out(root->rchild); } } void out(BiTree root){ //先序输出 if(root){ printf("%c",root->date); out(root->lchild); out(root->rchild); } } BiTree intit(){ //建立二叉树 BiTree root; char da; scanf("%c",&da); if(da ==' '){ root=NULL; }else{ root=(BiTree)malloc(sizeof(BTree)); root->date=da; root->lchild=intit(); root->rchild=intit(); } return root; }
相关推荐
二叉树是一种在计算机科学中广泛应用的数据结构,它由节点(也称为结点)组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的深度是指从根节点到最远叶节点的最长路径上边的数目,即树的最大层数...
二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...
在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...
(2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...
- **答案解析**:如果一棵二叉树的中序遍历序列和后序遍历序列正好相反,那么该二叉树一定是任一结点都没有左孩子的二叉树。 #### 5. 二叉树的结点数范围 - **答案解析**:深度为k的二叉树最多有\(2^k - 1\)个结点...
在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...