二叉树的常见操作

来源:互联网 发布:简明医学统计学软件 编辑:程序博客网 时间:2024/05/01 07:23

数据结构中树这一块儿一直是个难点和考点,刚好前几天在面实习生,面试过程中问到了二叉树并让写出代码,就想自己再写一遍二叉树的常见操作,目的为了留着以后用起来方便,于是乎,拿起书本又看了一遍,写下这些代码,编译环境是VS2012。

在Btree.h中的有下列声明和定义:

typedef struct BtNode//二叉树的数据结构
{
char data;
struct BtNode*lchild,*rchild;
}BtNode,*BTree;

void CreateBTree(BTree& Bt);//二叉树的创建

void PreOrder(BTree &Bt);//二叉树前序遍历

void PreOrderNon(BTree &Bt);//二叉树前序非递归遍历

void MidOrder(BTree &Bt);//二叉树中序遍历

void MidOrderNon(BTree &Bt);//二叉树非递归中序遍历

void LastOrder(BTree &Bt);//二叉树后序遍历

void LastOrderNon(BTree &Bt);//二叉树非递归后序遍历

void LevelOrder(BTree &Bt);//二叉树层次遍历

BtNode * CommonParent1(BtNode *root,BtNode *bt1,BtNode *bt2);//求最近公共父节点

int Depth(BTree &Bt);//二叉树的深度

int leafCount(BTree &Bt);//二叉树叶子节点的个数

void Exchagechild(BTree &Bt);//交换二叉树的左右孩子

bool IsBalanceTree(BTree &Bt);//是否为平衡二叉树

void DestroyTree(BtNode *Bt);//二叉树的销毁

在BTree.cpp中有一下函数实现:

#include<iostream>#include"Btree.h"#include<stack>#include<queue>using namespace std;//先序创建二叉树void CreateBTree(BTree &Bt){char ch;cin>>ch;if(ch == '#')   Bt=NULL;else{Bt = new BtNode;Bt->data = ch;CreateBTree(Bt->lchild);//递归创建左子树CreateBTree(Bt->rchild);//递归创建右子树}}//递归先序遍历void PreOrder(BTree &Bt){if(Bt == NULL) return ;cout<<Bt->data<<" ";PreOrder(Bt->lchild);PreOrder(Bt->rchild);}//非递归先序遍历void PreOrderNon(BTree &Bt){if (Bt == NULL) return ;stack<BTree> s;BTree p = Bt;while(!s.empty() || p != NULL){if( p != NULL){cout<<p->data<<" ";s.push(p);p = p->lchild;}if(!s.empty()){p = s.top();s.pop();p = p->rchild;}}}//递归中序遍历void MidOrder(BTree &Bt){if (Bt == NULL) return ;MidOrder(Bt->lchild);cout<<Bt->data<<" ";MidOrder(Bt->rchild);}//非递归中序遍历void MidOrderNon(BTree &Bt){if(Bt == NULL) return ;BTree p = Bt;stack<BTree> s;while( p != NULL || !s.empty() ){while( p != NULL){s.push(p);p = p->lchild;}if(!s.empty()){p = s.top();s.pop();cout<<p->data<<" ";p = p->rchild;}}}//递归后序遍历void LastOrder(BTree &Bt){if(Bt== NULL) return ;LastOrder(Bt->lchild);LastOrder(Bt->rchild);cout<<Bt->data<<" ";}//非递归后序遍历void LastOrderNon(BTree &Bt){if(Bt == NULL) return ;stack<BTree> s;BTree p = Bt;BTree visted = NULL;while(p != NULL || !s.empty()){while(p != NULL){s.push(p);p = p->lchild;}p = s.top();if(p->rchild == NULL || p->rchild == visted){cout<<p->data<<" ";visted = p;s.pop();p = NULL;}else{p = p->rchild;}}}//层次遍历void LevelOrder(BTree &Bt){queue<BTree> q;BTree temp = NULL;if(Bt != NULL) q.push(Bt);while(!q.empty()){temp = q.front();q.pop();cout<<temp->data<< " ";if(temp->lchild != NULL){q.push(temp->lchild);}if(temp->rchild != NULL){q.push(temp->rchild);}}}//求公共父节点,已知两个子节点BtNode * CommonParent(BtNode *root,BtNode *bt1,BtNode *bt2){if(root == NULL) return NULL;if(bt1 == root || bt2 == root) return root;BtNode *left = CommonParent(root->lchild,bt1,bt2);BtNode*right = CommonParent(root->rchild,bt1,bt2);if(left && right )return root;return left ?left:right;}//二叉树深度int Depth(BTree &Bt){if(Bt == NULL ) return 0;int len1 = Depth(Bt->lchild);int len2 = Depth(Bt->rchild);return len1>len2?len1+1:len2+1;}//叶子节点总数int leafCount(BTree &Bt){if(Bt == NULL) return 0;if(Bt->lchild== NULL && Bt->rchild == NULL){return 1;}return leafCount(Bt->lchild)+leafCount(Bt->rchild);}//交换左右孩子void Exchagechild(BTree &Bt){if(Bt == NULL) return ;BTree temp = NULL;if(Bt->lchild || Bt->rchild){temp = Bt->lchild;Bt->lchild = Bt->rchild;Bt->rchild = temp;Exchagechild(Bt->lchild);Exchagechild(Bt->rchild);}}//是否是平衡二叉树bool IsBalanceTree(BTree &Bt){if(Bt == NULL)return true;int ldepth = Depth(Bt->lchild);int rdepth = Depth(Bt->rchild);int  dis = ldepth-rdepth;if(dis >1 || dis <-1)  return false;return IsBalanceTree(Bt->lchild) && IsBalanceTree(Bt->rchild);}//销毁树void DestroyTree(BtNode *Bt){if(Bt == NULL)return ;DestroyTree(Bt->lchild);DestroyTree(Bt->rchild);delete Bt;}int main(){BTree T;CreateBTree(T);cout<<"PreOrder:";PreOrder(T);cout<<endl;cout<<"MidOrder:";MidOrder(T);cout<<endl;cout<<"LastOrder:";LastOrder(T);cout<<endl;cout<<"PreOrderNon:";PreOrderNon(T);cout<<endl;cout<<"LevelOrder:";LevelOrder(T);cout<<endl;cout<<"leafCount:";cout<<leafCount(T)<<endl;cout<<"Depth:";cout<<Depth(T)<<endl;cout<<"Exchangechild:";Exchagechild(T);PreOrder(T);cout<<endl;cout<<"MidOrderNon:";MidOrderNon(T);cout<<endl;cout<<"LastOrderNon:";LastOrderNon(T);cout<<endl;cout<<"IsBalanceTree:";if(IsBalanceTree(T))cout<<"IsBanlanceTree"<<endl;elsecout<<"IsNotBanlanceTree"<<endl;cout<<"CommonParent:";cout<<(CommonParent(T,T->lchild->lchild,T->rchild->rchild))->data;cout<<endl;return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打嗝停不下来怎么办 咳嗽停不下来怎么办 电动机停不下来怎么办 电脑所有程序都打不开怎么办 机顶盒画面卡顿怎么办 电脑画面卡顿怎么办 鞋舌头跑偏怎么办 球球大作战老卡怎么办 孩子被打却不敢还手怎么办? 自卫砍伤了人怎么办 系统还原节点黑屏了怎么办 我惹事了要被打怎么办 诛仙宠物太多怎么办 笔记本玩lolfps低怎么办 lol延迟有42怎么办 软件安装后黑屏怎么办 汽车脚垫翘边怎么办 晴季寿司会员怎么办 理财产品跑路了怎么办 宝宝足跟血异常怎么办 孩子足跟血异常怎么办 打印机显示用户干预怎么办 打印机脱机状态怎么办win10 电脑打印机显示脱机怎么办 佳能打印机显示脱机怎么办 汽车说明书丢了怎么办 oppo手机刷机后内存不足怎么办 电脑运行太慢怎么办 台式电脑卡慢怎么办 touch炫舞不记得区怎么办 产能过剩是带怎么办 裸辞找不到工作怎么办 30岁找不到工作怎么办 20岁找不到工作怎么办 年轻人一直找不到工作怎么办 经济不好的时候怎么办 dnf86没任务了怎么办 dnf打团队友开挂怎么办 幽灵行动4黑屏怎么办 禁用了显卡黑屏怎么办 w10系统卡死怎么办