二叉排序树的理解
来源:互联网 发布:linux怎么访问网页 编辑:程序博客网 时间:2024/06/13 02:43
转载至http://blog.csdn.net/jialeheyeshu/article/details/52343791
二叉树遍历的理解
首先建立一个树:
class Tree
{
int Node;
Tree leftTree;
Tree rightTree;
//构造函数
public Tree(int v)
{
Node = v;
this.leftTree = null;
this.rightTree = null;
}
//插入子树
public void Insert_Tree(int value)
{
//若值小则插入在左边
if (this.Node.CompareTo(value) > 0)
{
if (this.leftTree == null) //若为空,说明没有这个子树
{
this.leftTree = new Tree(value);
}
else //不为空,说明这个子树还可以向下插入
{
this.leftTree.Insert_Tree(value);
}
}
//若值大则插入在右边
else
{
if (this.rightTree == null)
{
this.rightTree = new Tree(value);
}
else
{
this.rightTree.Insert_Tree(value);
}
}
}
//遍历树,先序遍历
public void pre_view()
{
Console.WriteLine(this.Node);
if (this.leftTree != null)
{
this.leftTree.pre_view();
}
if (this.rightTree != null)
{
this.rightTree.pre_view();
}
}
//遍历树,中序遍历
public void mdi_view()
{
if (this.leftTree != null)
{
this.leftTree.mdi_view();
}
Console.WriteLine(this.Node);
if (this.rightTree != null)
{
this.rightTree.mdi_view();
}
}
//遍历树,后序遍历
public void last_view()
{
if (this.leftTree != null)
{
this.leftTree.last_view();
}
if (this.rightTree != null)
{
this.rightTree.last_view();
}
Console.WriteLine(this.Node);
}
}
二叉排序树插入时安排先序遍历的方式进行插入:
如图:插入顺序为:8,3,1,6,4,7,10,14,13
Tree mytree = new Tree(8);
mytree.Insert_Tree(3);
mytree.Insert_Tree(1);
mytree.Insert_Tree(6);
mytree.Insert_Tree(4);
mytree.Insert_Tree(7);
mytree.Insert_Tree(10);
mytree.Insert_Tree(14);
mytree.Insert_Tree(13);
Console.WriteLine("先序:");
mytree.pre_view();
Console.WriteLine("中序:");
mytree.mdi_view();
Console.WriteLine("后序:");
mytree.last_view();
如果对于上述遍历仍然不清楚可以看看下面对于二叉树的遍历理解
要想彻底的理解递归就必须对程序调用子程序的过程有所了解,也就是系统对程序点的压栈和出栈操作,在主程序调用子程序的时候,系统是将子程序的入口点做压栈操作,在调用完子程序后,系统执行退栈操作,继续从主程序的位置往下执行。如果子程序中还有子程序,就会多次执行压栈和退栈操作。如图左边是二叉树,右边是遍历代码。
首先判断根节点A的左子树是否为空,因为A有左子树所以执行代码1,这是相当于执行子程序了,系统为了保证程序能正常执行,需要现将1位置处的断点压栈,为的就是在执行完子程序后能让主程序继续执行,所以:我们可以想象系统在执行节点A时将代码1位置的断点压栈(我们在这里为了简单就说将A压栈),接着执行节点A的左子树B的遍历,由于节点B还是有左子树,所以继续将B压栈,由于D没有左子树,所以执行D层中的打印语句(也就是代码2),接着判断D有没有右子树,发现D没有右子树,于是系统开始出栈操作,这时的栈中有那些断点呢
栈:A B
B出栈,断点出栈后,程序是从断点的下一条指令开始执行,因为if语句中没有指令了,于是就从2开始执行,调用打印B的操作,接着由于B有右子树,所以开始执行3,此时再次将B层的这个断点压栈,去执行E层的代码,由于E没有左子树所以执行打印E的操作,同时E没有右孩子,所以退栈到B层,但是B层的下一条指令没有了,于是B层执行完了跳出B层回到A层,此时栈中保存的是A层的1处的断点,所以继续上面的思路执行A层的代码2打印A,接着由于A有右孩子,于是C进栈,和前面的思路一样,打印完F,退回到C层打印C,最后打印G,在G层执行完后退回到C层3处,同样C层没有可执行的代码跳出C层,继续退回到A层3出,A层3处的下一条指令也没有了,于是A层执行完跳出,至此栈中也空程序执行完毕。
- 二叉排序树的理解
- amor详解 二叉排序树的使用以及理解
- 写二叉排序树的问题与指针的理解
- 二叉排序树、红黑树、AVL树最简单的理解
- 二叉排序树(Java)--一个假程序员的理解
- 二叉排序树与平衡二叉排序树的转化
- 【数据结构】二叉排序树小礼包(对splay,Treap,SBT的理解,例题,代码)
- 二叉排序树上的查找
- 二叉排序树的实现
- 二叉排序树的查找
- 二叉排序树的删除
- 二叉排序树的建立-java
- 二叉排序树的应用
- 二叉排序树的C代码
- 二叉排序树的创建
- 二叉排序树的简单实现
- 二叉排序树的创建
- 二叉排序树调整的方法
- (转)Java后端学习流程
- nginx安装
- 欢迎使用CSDN-markdown编辑器
- Leetcode_406 Queue Reconstruction by Height
- scratch克隆体编号
- 二叉排序树的理解
- linux在shell中获取时间
- Spring MVC中用@ResponseBody转json,字段为NULL或者为空不参加序列化方法汇总
- otter系列—otter_node 安装配置(快速开始)
- struts2练习及巩固
- [nodejs] 之 fs
- 互联网时代下得移动场景营销
- oracle索引和sql优化
- 20171025_chr_classmultifileupload 多文件上传