前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法。

二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推!

二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处。

二叉树的先序遍历:先访问根节点,再访问先后访问左右节点。如图:

二叉树的递归遍历之java:

package rest;

//构造节点,生成一颗树
class Node
{
Node(String Letter){ //构造函数
value=Letter;
}
public Node left; //左节点
public Node right; //右节点
public String value;
}
public class Test
{
public static void main(String[] args)
{
//以下是构建上图中的二叉树,从根节点起一层一层的构建
Node root = new Node("A");
Node first = new Node("B");
Node second = new Node("C");
Node third = new Node("D");
Node foth = new Node("E");
Node fifth = new Node("F");
Node sixth = new Node("G");
Node seventh = new Node("H");
Node eghit = new Node("I");
Node nineth = new Node("G");
//以下是建立二叉树之间的关系
root.left=first;
root.right=second;
first.left=third;
second.left=foth;
second.right=fifth;
third.right=seventh;
third.left=nineth;
foth.right=eghit; // Node root.left.left = new Node("D");
Recursive(root); } //以下是二叉树递归遍历的主题代码算法函数
public static void Recursive(Node node){
if(node.value==""){
System.out.println("这是一颗空树!"); //测试根节点是否为空,并且为程序的出口
}else{
System.out.print(node.value);
}
if(node.left!=null){
Recursive(node.left); //递归左子树的节点
}
if(node.right!=null){
Recursive(node.right); //递归右子树的节点
} } }

打印查来的结果为:

run:
ABDGHCEIF成功构建 (总时间: 0 秒)

二叉树非递归遍历,不用栈使O(1)之java:

 package rest;

 //构造节点,生成一颗树
class Nod
{
Nod(String Letter){ //构造函数
value=Letter;
}
public Nod per; //为了实现不用栈,使O(1),记录他的父节点
public Nod left; //左节点
public Nod right; //右节点
public String value;
public int flag=0; //访问标志位
}
public class Cycles
{
public static void main(String[] args)
{
//以下是构建上图中的二叉树,从根节点起一层一层的构建
Nod root = new Nod("A");
Nod first = new Nod("B");
Nod second = new Nod("C");
Nod third = new Nod("D");
Nod foth = new Nod("E");
Nod fifth = new Nod("F");
Nod sixth = new Nod("G");
Nod seventh = new Nod("H");
Nod eghit = new Nod("I");
Nod set =new Nod("sdfsa");
//以下是建立二叉树之间的关系
root.left=first;
root.right=second;
first.per = root;
first.left=third; second.per=root;
second.left=foth;
second.right=fifth; third.per=first;
third.right=seventh;
third.left=sixth; foth.per=second;
foth.right=eghit;
fifth.per=second; sixth.per=third;
seventh.per=third;
eghit.per=foth; if(root==null){
System.out.println("这是一颗空树");
} Nod index=root;
while(index!=null){
if(index.flag==0){
System.out.print(index.value); index.flag=1;
}
if(index.left!=null&&index.left.flag==0){
index=index.left;
}else{
if(index.right!=null&&index.right.flag==0){
index=index.right;
}else{
index = index.per; //回溯自己的父节点
} }
} }
}

run:
ABDGHCEIF成功构建 (总时间: 0 秒)

总结:我在调试这个的时候出现的几点问题:

我在回溯父节点的那段代码时,一开始尝试的是通过回溯父节点,然后再指向自己的子节点,判断是否为空,来测试代码是否运行到该行下,但是却行不通.

代码如下:

if(index.right==null){

System.out.print("代码可运行至此");

}else{

System.out.print("代码无法判断右节点");

}

但是结果却是,什么都没有显示,尼玛真的什么都没有显示。。。。我就无语了,好在不影响代码实现。

2.但是我在测试System.out.print(index.right.value);居然可以!居然可以!这一点还不太明白。

二叉树非递归遍历,使用栈之java:

既然要用到栈,那就要说明一下栈是什么???栈无非就是先进后出的数据结构,我们可以引进import java.util.Stack;但是也可以自己写。

栈主要的操作有

1.public Stack()                        创建一个空堆栈类

2.public boolean empty()          带布尔返回值的函数,测试堆栈是否为空;

3.public  pop()                         弹出堆栈顶部的对象,并作为此函数的值返回该对象,输出 ,出栈操作

4.public  push()                      压栈操作

5.public  peek()                      查看堆栈顶部的对象,但不从堆栈中移除它。 起标记作用

6.public boolean full()             满栈

 package rest;

 /**
*
* @author 曹想-
*/
class Stack
{
private Nod2 StackArr[] ;
private int top;
public Stack(){
this.top=-1; //之所以是以-1开始是因为数组是以0为开始
this.StackArr = new Nod2[50]; //限定长度为50
}
public void push(Nod2 index){
StackArr[++top]=index;
}
public Nod2 pop(){
return StackArr[top--]; //出栈操作
}
public boolean isempty(){ //判断是否为空
return this.top==-1;
} } class Nod2
{
Nod2(String Letter){ //构造函数
value=Letter;
}
public Nod2 left; //左节点
public Nod2 right; //右节点
public String value;
} public class Test2{
public static void main(String arg[]){
//以下是构建上图中的二叉树,从根节点起一层一层的构建
Nod2 root = new Nod2("A");
Nod2 first = new Nod2("B");
Nod2 second = new Nod2("C");
Nod2 third = new Nod2("D");
Nod2 foth = new Nod2("E");
Nod2 fifth = new Nod2("F");
Nod2 sixth = new Nod2("G");
Nod2 seventh = new Nod2("H");
Nod2 eghit = new Nod2("I");
Nod2 set =new Nod2("sdfsa");
//以下是建立二叉树之间的关系
root.left=first;
root.right=second; first.left=third; second.left=foth;
second.right=fifth; third.right=seventh;
third.left=sixth; foth.right=eghit; //以下是利用栈的实现
Stack st = new Stack();
if(root==null){
System.out.println("这是一颗空树");
} Nod2 index = root;
while (index != null || !st.isempty()) { //如果index为空说明节点遍历完了,栈为空说明已经完成遍历
while (index != null) { //先遍历左子树,并打印节点,将节入栈
System.out.print(index.value);
st.push(index);
index = index.left;
}
if (!st.isempty()) { //将节点出栈,遍历右节点
index = st.pop();
index = index.right;
}
}
}
}

非递归栈的另一种算法:

Stack st = new Stack();
         if(root==null){
             System.out.println("这是一颗空树");
         }
       Nod2 index = root;
       int n=9;                       //这里的n是节点的个数,由一开始输入节点的个数决定
        while(n--!=0){  
              System.out.println(index.value);      //输出遍历节点值
              st.push(index);                               //将节点值入栈
             if(index.left!=null){
                  index = index.left;                    //遍历左节点
              }else{
                    while(!st.isempty()){              //栈不为空,则循环
                        Nod2 Tem = st.pop().right; //右节点不为空则设置右节点为index遍历
                        if(Tem!=null){
                            index =Tem;
                            break;
                        }
                    }
              }
      
        }

QQ:1689986723

欢迎批评指正!

数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java的更多相关文章

  1. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  2. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  3. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  4. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  5. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  6. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  7. java扫描文件夹下面的所有文件(递归与非递归实现)

    java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...

  8. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  9. AJPFX:递归与非递归之间的转化

    在常规表达式求值中: 输入为四则运算表达式,仅由数字.+.-.*./ .(.) 组成,没有空格,要求求其值. 我们知道有运算等级,从左至右,括号里面的先运算,其次是* ./,再是+.- : 这样我们就 ...

随机推荐

  1. 用对象型泛型和ArraysList写一个输入学员信息并展示

    题目:录入学员信息并保存,当录入学员的编号为0时结束,展示出学员信息 //student类 public class Student { public int id; public String na ...

  2. python(6)- hashlib模块

    加密算法: SHA1,SHA224, SHA256, SHA384, SHA512 , MD5 1. md5 import hashlib m = hashlib.md5() m.update(b&q ...

  3. MAC下查看端口占用并杀死进程

    Eclipse在Run on Server时,Tomcat是开启的,但是报错,显示8080.8005和8009端口被占用 终端输入 查看所有开启的端口 sudo lsof -i -P | grep - ...

  4. 关于Override在JDK1.5和JDK1.6上子类实现接口中方法使用@Override注解编译错误.

    遇到这个问题说来也怪.新开了一个path的工作空间用来打patch.该Eclipse的默认全局的编译版本是1.6.但是唯独其中的一个插件项目的版本是1.5(可能是唯一的一个,不确定,不知道为什么会是这 ...

  5. sharepoint 中用自带的download.aspx实现文件的下载,中文文件名编码的问题

    ]中的路径绑定的是下载路径,用到了sharepoint中自带的download.aspx下载页面,只要将文件的URL赋值给sourceurl即可,但是我前台用的是<a>标签的href来导向 ...

  6. 截图技巧——鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬。

    截图技巧--鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬.

  7. <转>HTML+CSS总结/深入理解CSS盒子模型

    原文地址:http://www.chinaz.com/design/2010/1229/151993.shtml 前言:前阵子在做一个项目时,在页面布局方面遇到了一点小问题,于是上stackoverf ...

  8. Spring(3.2.3) - Beans(3): Bean 实例的创建方式

    创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML ...

  9. Ehcache(2.9.x) - API Developer Guide, Blocking and Self Populating Caches

    About Blocking and Self-Populating Caches The net.sf.ehcache.constructs package contains some applie ...

  10. Android中用PULL解析XML

    解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...