二叉树前序,中序,后序递归和非递归实现

TreeNode定义

 1 public class TreeNode {
 2     public TreeNode left;
 3     public TreeNode right;
 4     public int val;
 5
 6     public TreeNode(int val) {
 7         this.val = val;
 8     }
 9
10     /**
11      * 搞一棵二叉树出来
12      *                     1
13      *                    /  14      *                   2    3
15      *                 \  / 16      *                  4 5  6
17      * @return
18      */
19     public static TreeNode createTree(){
20         TreeNode root = new TreeNode(1);
21         TreeNode node1 = new TreeNode(2);
22         TreeNode node2 = new TreeNode(3);
23         TreeNode node3 = new TreeNode(4);
24         TreeNode node4 = new TreeNode(5);
25         TreeNode node5 = new TreeNode(6);
26
27         root.left = node1;
28         root.right = node2;
29
30         node1.right = node3;
31         node2.left = node4;
32         node2.right = node5;
33
34         return root;
35     }
36 }

---------------------------------------------我是分割线,前序遍历---------------------------------------

 1 /**
 2  * 前序遍历非递归实现
 3  * @author GXF
 4  *
 5  */
 6 public class PreOrderTreeByNoRec {
 7
 8     public static void main(String[] args) {
 9         PreOrderTreeByNoRec preOrderTreeByNoRec = new PreOrderTreeByNoRec();
10         TreeNode root = TreeNode.createTree();
11         preOrderTreeByNoRec.preOrderByRecursive(root);
12         System.out.println();
13         preOrderTreeByNoRec.preOrderByNoRec(root);
14
15     }
16
17     /**
18      * 前序遍历二叉树,非递归实现
19      * @param root
20      */
21     public void preOrderByNoRec(TreeNode root){
22         if(root == null)
23             return;
24         Stack<TreeNode> stack = new Stack<TreeNode>();
25         System.out.print(root.val + " ");
26         stack.push(root);
27
28         TreeNode curPoint = root.left;
29
30         while(!stack.isEmpty() || curPoint != null){
31             if(curPoint != null){
32                 System.out.print(curPoint.val + " ");
33                 stack.push(curPoint);
34                 curPoint = curPoint.left;
35             }//if
36
37             curPoint = stack.pop().right;
38         }
39
40         System.out.println();
41
42     }
43
44     /**
45      * 前序遍历递归实现
46      * @param root
47      */
48     public void preOrderByRecursive(TreeNode root){
49         if(root != null){
50             System.out.print(root.val + " ");
51             preOrderByRecursive(root.left);
52             preOrderByRecursive(root.right);
53         }
54
55
56     }
57
58
59
60 }

---------------------------------------------我是分割线,中序遍历---------------------------------------

 1 import java.util.Stack;
 2
 3 /**
 4  * 中序遍历的非递归实现
 5  * @author GXF
 6  *
 7  */
 8 public class InorderTreeByNoRecursive {
 9
10     public static void main(String[] args) {
11         InorderTreeByNoRecursive inorderTreeByNoRecursive = new InorderTreeByNoRecursive();
12         TreeNode root = TreeNode.createTree();
13
14         inorderTreeByNoRecursive.inorderByRecursive(root);
15         System.out.println();
16         inorderTreeByNoRecursive.inorderByNoRecursive(root);
17     }
18
19     /**
20      * 中序遍历递归实现
21      */
22     public void inorderByRecursive(TreeNode root){
23         if(root != null){
24             inorderByRecursive(root.left);
25             System.out.print(root.val + " ");
26             inorderByRecursive(root.right);
27         }
28     }
29
30     /**
31      * 中序遍历非递归实现
32      * @param root
33      */
34     public void inorderByNoRecursive(TreeNode root){
35         if(root == null)
36             return;
37         Stack<TreeNode> stack = new Stack<TreeNode>();
38         stack.push(root);
39         TreeNode curPoint = root.left;
40         //开始中序遍历
41         while(curPoint != null || !stack.isEmpty()){
42             while(curPoint != null){
43                 stack.push(curPoint);
44                 curPoint = curPoint.left;
45             }//while
46
47             //访问根结点
48             curPoint = stack.pop();
49             System.out.print(curPoint.val + " ");
50             curPoint = curPoint.right;
51         }
52     }
53
54 }

---------------------------------------------我是分割线,后序遍历---------------------------------------

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 import java.util.Stack;
 4
 5 public class PostorderNoRecurvise {
 6
 7     public static void main(String[] args) {
 8         TreeNode root = TreeNode.createTree();
 9
10         PostorderNoRecurvise postorderNoRecurvise = new PostorderNoRecurvise();
11         postorderNoRecurvise.postorderByRecursive(root);
12         System.out.println();
13         postorderNoRecurvise.postorderByNoRecurvise(root);
14     }
15
16     /**
17      * 递归进行后序遍历
18      * @param root
19      */
20     public void postorderByRecursive(TreeNode root){
21         if(root != null){
22             postorderByRecursive(root.left);
23             postorderByRecursive(root.right);
24             System.out.print(root.val + " ");
25         }
26     }
27
28     /**
29      * 后序遍历非递归实现
30      * @param root
31      */
32     public void postorderByNoRecurvise(TreeNode root){
33         if(root == null)
34             return;
35         //记录结点是否被访问过
36         Map<TreeNode, Boolean> visited = new HashMap<TreeNode, Boolean>();
37         Stack<TreeNode> stack = new Stack<TreeNode>();
38         stack.push(root);
39         TreeNode curPoint = root.left;
40         while(curPoint != null)
41         {
42             stack.push(curPoint);
43             curPoint = curPoint.left;
44         }
45         while(!stack.isEmpty()){
46             curPoint = stack.peek();
47             if(curPoint.right == null || visited.get(curPoint.right) != null){
48                 curPoint = stack.pop();
49                 System.out.print(curPoint.val + " ");
50                 visited.put(curPoint, true);
51             }
52             else{
53                 curPoint = curPoint.right;
54                 while(curPoint != null){
55                     stack.push(curPoint);
56                     curPoint = curPoint.left;
57                 }
58             }
59         }
60     }
61
62 }

后序遍历需要额外空间保存已经访问过的节点,层序遍历直接使用队列就okay了。明天有时间搞一下

时间: 2024-10-26 12:01:04

二叉树前序,中序,后序递归和非递归实现的相关文章

数据结构:二叉树(前,中,后,层次)非递归遍历。

#include <iostream> #include <stack> #include <map> #include <queue> #include <string.h> using namespace std; struct Node { char data; Node *left; Node *right; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class T

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

已知二叉树前、中序遍历,求后序 / 已知二叉树中、后序遍历,求前序

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

前序中序后序遍历非递归实现

#include<iostream> #include<vector> #include<stack> #include<string> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),left(NULL),right(NULL){

二叉树的先序、中序、后序、层次遍历的递归和非递归解法

二叉树的先序.中序.后序.层次遍历的递归和非递归解法 package tree; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class TreeTraverse { /** * 先序递归 * @param root */ public static void preOrderTraverse(TreeNode root) { if (root == null) { ret