二叉树的遍历(递归、非递归)

理论:

1.先(根)序遍历的递归定义:

若二叉树非空,则依次执行如下操作:

⑴ 访问根结点;

⑵ 遍历左子树;

⑶ 遍历右子树。

2.中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵访问根结点;

⑶遍历右子树。

3.后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵遍历右子树;

⑶访问根结点

java实现

package 二叉树;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class BSTree {

    private    List<Node>nodeList=new ArrayList<Node>();
 public Node CreateTree(int[] a){
        for(int data:a)
            nodeList.add(new Node(data));

        int lastLeftRoot=a.length/2-1;

        for(int i=lastLeftRoot; i>=0; i--)
        {
            Node root=nodeList.get(i);

            int leftIndex=i*2+1;
            int rightIndex=leftIndex+1;
            if(leftIndex<a.length);
            {
                Node left=nodeList.get(leftIndex);
                root.setLeft(left);
            }
            if(rightIndex<a.length)
            {
                Node right=nodeList.get(rightIndex);
                root.setRgiht(right);
            }
        }
        Node root=nodeList.get(0);
        return root;
    }

    public static void printNode(Node node){
        System.out.print(node.getData()+" ");
    }

    public static void preOrderStack(Node node){
        Stack<Node> stack=new Stack<Node>();
        Node p=node;
        if(node!=null)
        {
            stack.push(p);
            while(!stack.isEmpty())
            {
                Node top=stack.pop();
                printNode(top);
                if(top.getRight()!=null) stack.push(top.getRight());
                if(top.getLeft()!=null) stack.push(top.getLeft());
            }
        }
    }

    public static void minOrderStack(Node node){
        Stack<Node> stack=new Stack<Node>();
        Node p=node;
        while(p!=null ||!stack.isEmpty())
        {
            while(p!=null)
            {
                stack.push(p);
                p=p.getLeft();
            }
            if(!stack.isEmpty())
            {
                p=stack.pop();
                printNode(p);
                p=p.getRight();
            }
        }
    }

    public static void postOrderStack(Node node){
        Stack<Node> stack=new Stack<Node>();
        Node p=node;
        Node q=p;
        while(p!=null)
        {
            while(p.getLeft()!=null)
            {
                stack.push(p);
                p=p.getLeft();
            }

        while(p!=null&&(p.getRight()==null||p.getRight()==q))
        {
            printNode(p);
            q=p;
            if(stack.isEmpty())return;
            p=stack.pop();
             }
            stack.push(p);
            p=p.getRight();
        }
    }
    public static void preTrav(Node node){
        if(node==null)
            return;
        System.out.print(node.getData()+" ");
        preTrav(node.getLeft());
        preTrav(node.getRight());
    }
    public static void midTrav(Node node){
        if(node==null)
            return;
        midTrav(node.getLeft());
        System.out.print(node.getData()+" ");
        midTrav(node.getRight());
    }
    public static void postTrav(Node node){

        if(node==null)
            return;
        postTrav(node.getLeft());
        postTrav(node.getRight());
        System.out.print(node.getData()+" ");
    }
public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a={10,6,14,4,8,12,16};//这些数据是按二叉查找树的层次遍历存放
        BSTree bt=new BSTree();
        Node root=bt.CreateTree(a);
        preTrav(root);
        System.out.println();
        preOrderStack(root);
        System.out.println();
        midTrav(root);
        System.out.println();
        minOrderStack(root);
        System.out.println();
        postTrav(root);
        System.out.println();
        postOrderStack(root);
        System.out.println();

    }

}
时间: 2024-12-16 09:11:07

二叉树的遍历(递归、非递归)的相关文章

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里. 图示 代码实现 /** * 源代码名称:TreeIteratorNoRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历(非递归) * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class TreeIteratorNoRecursion { class TreeNode<T> { private T mNod

二叉树的遍历(非递归方式)

前序非递归遍历(借用栈结构): ①将根节点入栈: ②判栈空,获取栈顶元素输出: ③判断右子树是否为空,再判断左子树是否为空,在回至②执行. void PreOrder(BinTree bt) { stack<BinTree> astack; BinTreeNode * p; astack.push(bt); while(!astack.empty()) { p=astack.top(); astack.pop(); cout<<p->data<<" &q

二叉树的遍历的非递归实现

采用堆栈实现 1.先序遍历 void InOrderTraversal(BinTree BT) { BinTree T=BT; Stack S=CreatStack(MaxSize); while(T || !IsEmpty(S)) { while(T)//T存在就压栈,遍历其左子树 { Push(S,T); T=T->Left; } if(!IsEmpty(S))//压入的全部弹出来 { T=Pop(S); printf("%d\n",T->Data); T=T->

二叉树的遍历(非递归)

1. 先序遍历 public void preorder(TreeNode root) { if(root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); while(true) { if(root == null) { if(stack.isEmpty()) break; root = stack.pop(); } else { System.out.println(root.val); if(roo

LintCode 二叉树的遍历 (非递归)

前序: class Solution { public: /** * @param root: The root of binary tree. * @return: Preorder in vector which contains node values. */ vector<int> preorderTraversal(TreeNode *root) { // write your code here stack<TreeNode*> s; vector<int>

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

二叉树,递归非递归遍历算法(全)

包含了所有的非递归和递归的算法: #include<iostream> #include<queue> #include<stack> using namespace std; //二叉树结点的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍历创建二叉树 //BiTree *CreateBiTree() //返回结

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

二叉树的递归遍历和非递归遍历(附详细例子)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump