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

 1 public class BinTree {
 2     private char date;
 3     private BinTree lchild;
 4     private BinTree rchild;
 5
 6     public BinTree(char c) {
 7         date = c;
 8     }
 9
10     // 先序遍历递归
11     public static void preOrder(BinTree t) {
12         if (t == null) {
13             return;
14         }
15         System.out.print(t.date);
16         preOrder(t.lchild);
17         preOrder(t.rchild);
18     }
19
20     // 中序遍历递归
21     public static void InOrder(BinTree t) {
22         if (t == null) {
23             return;
24         }
25         InOrder(t.lchild);
26         System.out.print(t.date);
27         InOrder(t.rchild);
28     }
29
30     // 后序遍历递归
31     public static void PostOrder(BinTree t) {
32         if (t == null) {
33             return;
34         }
35         PostOrder(t.lchild);
36         PostOrder(t.rchild);
37         System.out.print(t.date);
38     }
39
40     // 先序遍历非递归
41     public static void preOrder2(BinTree t) {
42         Stack<BinTree> s = new Stack<BinTree>();
43         while (t != null || !s.empty()) {
44             while (t != null) {
45                 System.out.print(t.date);
46                 s.push(t);
47                 t = t.lchild;
48             }
49             if (!s.empty()) {
50                 t = s.pop();
51                 t = t.rchild;
52             }
53         }
54     }
55
56     // 中序遍历非递归
57     public static void InOrder2(BinTree t) {
58         Stack<BinTree> s = new Stack<BinTree>();
59         while (t != null || !s.empty()) {
60             while (t != null) {
61                 s.push(t);
62                 t = t.lchild;
63             }
64             if (!s.empty()) {
65                 t = s.pop();
66                 System.out.print(t.date);
67                 t = t.rchild;
68             }
69         }
70     }
71
72     // 后序遍历非递归
73     public static void PostOrder2(BinTree t) {
74         Stack<BinTree> s = new Stack<BinTree>();
75         Stack<Integer> s2 = new Stack<Integer>();
76         Integer i = new Integer(1);
77         while (t != null || !s.empty()) {
78             while (t != null) {
79                 s.push(t);
80                 s2.push(new Integer(0));
81                 t = t.lchild;
82             }
83             while (!s.empty() && s2.peek().equals(i)) {
84                 s2.pop();
85                 System.out.print(s.pop().date);
86             }
87
88             if (!s.empty()) {
89                 s2.pop();
90                 s2.push(new Integer(1));
91                 t = s.peek();
92                 t = t.rchild;
93             }
94         }
95     }
96     
时间: 2024-09-30 19:04:58

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

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

据说这个笔试面试的时候非常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