代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
数据结构-二叉树
作者:
冰辰之心
/ 发布于
2012/7/23
/
630
数据结构-二叉树
#include<iostream> #include<stack> #include<queue> using namespace std; static int i=0; enum Tags{Left,Right}; template<typename T>struct node { T data; node<T> *lchild,*right; }; template<typename T>struct elem{ node<T> *q; Tags Flags; }; template<typename T>class Tree{ private: node<T> *root; public: Tree(); Tree(string s); node<T> *create(); node<T> *create(string s); ~Tree(); void Release(node<T> *root); node<T> *getRoot(); void preTraverse(node<T> *root); //非递归先序遍历二叉树1 void PreTraverse(node<T> *root); //非递归先序遍历二叉树2 void midTraverse(node<T> *root); //非递归中序遍历二叉树 void posTraverse(node<T> *root); //非递归后序遍历二叉树 void levTraverse(node<T> *root); //按层次遍历二叉树 int getDepth(node<T> *root); //获得二叉树的高度 node<T> *getParent(node<T> *p); //获得二叉树某个节点的父节点 bool deleteChild(node<T> *p,bool LR); //删除二叉树某个节点的孩子节点,LR=0删除左子树,LR=1删除又子树; }; template<typename T> Tree<T>::Tree() { root=create(); } template<typename T> Tree<T>::Tree(string s) { root=create(s); } template<typename T> node<T> *Tree<T>::create() { node<T> *root; T e; cout<<"输入数据:"; cin>>e; if(e=='#') root=NULL; else { root=new node<T>; root->data=e; root->lchild=create(); root->right=create(); } return root; } template<typename T> node<T> *Tree<T>::create(string s) { node<T> *root; if(s[i]=='#') { root=NULL; i++; } else { root=new node<T>; root->data=s[i]; i++; root->lchild=create(s); root->right=create(s); } return root; } template<typename T> Tree<T>::~Tree() { Release(root); } template<typename T> void Tree<T>::Release(node<T> *root) { if(root!=NULL) { Release(root->lchild); Release(root->right); delete root; } } template<typename T> node<T> *Tree<T>::getRoot() { return root; } template<typename T> int Tree<T>::getDepth(node<T> *root) { int i,j; if(root==NULL) return 0; else { i=getDepth(root->lchild); j=getDepth(root->right); return i>j?i+1:j+1; } } template<typename T> void Tree<T>::PreTraverse(node<T> *root) { stack<node<T> *> s; node<T> *p=root; while(p!=NULL || !s.empty()) { while(p!=NULL) { cout<<p->data<<" "; s.push(p); p=p->lchild; } p=s.top(); s.pop(); p=p->right; } cout<<endl; } template<typename T> void Tree<T>::preTraverse(node<T> *root) { node<T> *p=root; stack<node<T> *> s; s.push(NULL); while(p!=NULL) { cout<<p->data<<" "; if(p->right!=NULL) s.push(p->right); if(p->lchild!=NULL) p=p->lchild; else { p=s.top(); s.pop(); } } cout<<endl; } template<typename T> void Tree<T>::midTraverse(node<T> *root) { node<T> *p=root; stack<node<T> *> s; while(p!=NULL || !s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } p=s.top(); s.pop(); cout<<p->data<<" "; p=p->right; } cout<<endl; } template<typename T> void Tree<T>::posTraverse(node<T> *root) { elem<T> se; stack<elem<T> > s; node<T> *p=root; while(!s.empty() || p!=NULL) { while(p!=NULL) { se.q=p; se.Flags=Left; s.push(se); p=p->lchild; } se=s.top(); s.pop(); p=se.q; if(se.Flags==Left) { se.Flags=Right; s.push(se); p=p->right; } else { cout<<p->data<<" "; p=NULL; } } cout<<endl; } template<typename T> void Tree<T>::levTraverse(node<T> *root) { queue<node<T> *> q; node<T> *p=root; q.push(root); while(!q.empty()) { p=q.front(); q.pop(); cout<<p->data<<" "; if(p->lchild!=NULL) q.push(p->lchild); if(p->right!=NULL) q.push(p->right); } } template<typename T> node<T>* Tree<T>::getParent(node<T> *p) { queue<node<T>* > q; node<T> *a=p; q.push(root); a=q.front(); if(a!=NULL) { while(!q.empty()) { if(a->lchild && a->lchild==p || a->right && a->right==p) { return a; break; } else { if(p->lchild!=NULL) q.push(a); if(p->right!=NULL) q.push(a); } } } return NULL; } template<typename T> bool Tree<T>::deleteChild(node<T> *p,bool LR) { if(p!=NULL) { if(!LR) { Release(p->lchild); p->lchild=NULL; } else { Release(p->right); p->right=NULL; } } else return false; } int main() { Tree<char> T; //Tree<char> T("ABD##E##CF##GH###"); T.preTraverse(T.getRoot()); T.PreTraverse(T.getRoot()); T.midTraverse(T.getRoot()); T.posTraverse(T.getRoot()); T.levTraverse(T.getRoot()); cout<<T.getParent(T.getRoot()->lchild)->data<<endl; cout<<T.getDepth(T.getRoot())<<endl; T.deleteChild(T.getRoot(),0); T.levTraverse(T.getRoot()); }
试试其它关键字
二叉树
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
冰辰之心
贡献的其它代码
(
1
)
.
数据结构-二叉树
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3