算法之二叉树遍历

【代码示例】

package com.wcs.java;
import java.util.ArrayList;
import java.util.List;

public class BinaryTree { 

    class TreeNode {

        public String data; //数据

        public TreeNode leftNode; //左子树

        public TreeNode rightNode; //右子树

        public TreeNode(String data, TreeNode leftNode, TreeNode rightNode) {
            this.data = data;
            this.leftNode = leftNode;
            this.rightNode = rightNode;
        }

        /**
         * @return the data
         */
        public String getData() {
            return data;
        }

        /**
         * @param data the data to set
         */
        public void setData(String data) {
            this.data = data;
        }

        /**
         * @return the leftNode
         */
        public TreeNode getLeftNode() {
            return leftNode;
        }

        /**
         * @param leftNode the leftNode to set
         */
        public void setLeftNode(TreeNode leftNode) {
            this.leftNode = leftNode;
        }

        /**
         * @return the rightNode
         */
        public TreeNode getRightNode() {
            return rightNode;
        }

        /**
         * @param rightNode the rightNode to set
         */
        public void setRightNode(TreeNode rightNode) {
            this.rightNode = rightNode;
        }
    }

    public TreeNode init() {
        TreeNode B = new TreeNode("B", null, null);
        TreeNode D = new TreeNode("D", null, B);
        TreeNode C = new TreeNode("C", D, null);

        TreeNode J = new TreeNode("J", null, null);
        TreeNode I = new TreeNode("I", J, null);
        TreeNode G = new TreeNode("G", I, null);
        TreeNode F = new TreeNode("F", null, G);
        TreeNode H = new TreeNode("H", null, null);
        TreeNode E = new TreeNode("E", F, H);

        TreeNode A = new TreeNode("A", C, E);

        return A;
    }

    private static List<String> list;

    public String printOut() {
        StringBuffer stringBuffer = new StringBuffer();
        for(int i=0; i<list.size(); i++) {
            stringBuffer.append(list.get(i) + (i!=list.size()-1 ? "-" : ""));
        }
        return stringBuffer.toString();
    }

    public void  preorderTraversal(TreeNode node) { //递归先序遍历
        if(node != null && node.getData() != null) {
            list.add(node.getData());
            if(node.getLeftNode() != null && node.getLeftNode().getData() != null) { //左子树不为空
                preorderTraversal(node.getLeftNode());
            }
            if(node.getRightNode() != null && node.getRightNode().getData() != null) { //右子树不为空
                preorderTraversal(node.getRightNode());
            }
        }
    }

    public void inorderTraversal(TreeNode node) { //递归中序遍历
        if(node != null && node.getData() != null) {
            if(node.getLeftNode() != null && node.getLeftNode().getData() != null) {
                inorderTraversal(node.getLeftNode());
            }
            list.add(node.getData());
            if(node.getRightNode() != null && node.getRightNode().getData() != null) {
                inorderTraversal(node.getRightNode());
            }
        }
    }

    public void postorderTraversal(TreeNode node) { //递归后序遍历
        if(node != null && node.getData() != null) {
            if(node.getLeftNode() != null && node.getLeftNode().getData() != null) {
                postorderTraversal(node.getLeftNode());
            }
            if(node.getRightNode() != null && node.getRightNode().getData() != null) {
                postorderTraversal(node.getRightNode());
            }
            list.add(node.getData());
        }
    }

    public static void main(String[] args) {
        //二叉树初始化
        BinaryTree binaryTree = new BinaryTree();
        TreeNode treeNode = binaryTree.init();
        //先序遍历
        list = new ArrayList<String>();
        binaryTree.preorderTraversal(treeNode);
        System.out.println("先序遍历: " + binaryTree.printOut());
        //中序遍历
        list = new ArrayList<String>();
        binaryTree.inorderTraversal(treeNode);
        System.out.println("中序遍历: " + binaryTree.printOut());
        //后序遍历
        list = new ArrayList<String>();
        binaryTree.postorderTraversal(treeNode);
        System.out.println("后序遍历: " + binaryTree.printOut());
    }

}

【二叉树】

【运行结果】

先序遍历: A-C-D-B-E-F-G-I-J-H

中序遍历: D-B-C-A-F-J-I-G-E-H

后序遍历: B-D-C-J-I-G-F-H-E-A

算法之二叉树遍历,布布扣,bubuko.com

时间: 2024-10-23 14:52:07

算法之二叉树遍历的相关文章

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

morris算法-----高级二叉树遍历算法

在遍历儿叉树时,常常使用的是递归遍历,或者是借助于栈来迭代,在遍历过程中,每个节点仅访问一次,所以这样遍历的时间复杂度为O(n),空间复杂度为O(n),并且递归的算法易于理解和实现.在遍历过程中,递归遍历过程的空间复杂度却是O(n),就算是转换为使用栈空间迭代时间,还是没有改变算法对额外空间的需求,在学习数据结构课程时,还学习了线索二叉树,在线索二叉树中,使用线索来保存节点的前驱和后继的信息,而这些线索是利用了叶节点的空指针域来保存,所以知道了树种每个节点的前驱和后继的位置(指针)可以有效降低遍

数据结构算法实现-二叉树遍历的非递归算法

由于递归算法使用系统堆栈,性能较差,所以应尽可能使用非递归算法. 1.先序遍历 先序遍历,即得到节点时输出数据. // 先序遍历 function PreOrder(node){ if(node!==undefined){ console.log(node.data) } var stack=[] //模仿递归的栈 stack.push(node) for(var temp=node,i=0;temp!==undefined;temp=stack[stack.length-1]){ if(tem

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)

python实现二叉树遍历算法

说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. 以下直入主题: 定义一颗二叉树,请看官自行想象其形状, class BinNode( ): def __init__( self, val ): self.lchild = None self.rchild = None self.value = val binNode1 = BinNode( 1

Binary Tree Traversal Algorithms (二叉树遍历算法)

本文共列出了11个常见的二叉树遍历算法.二叉树的遍历主要有深度优先遍历和广度优先遍历.深度优先遍历包含前序遍历.中序遍历和后序遍历. 值得一提的是, 其中的 Morris 算法 可以线性时间不需要额外空间(用户栈或系统栈空间)实现二叉树的前序遍历.中序遍历和后序遍历.关于Morris算法, 可参考 http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html 算法清单: A1. A2. A3, 分别是中序遍历的递归

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

每天刷个算法题20160518:非递归二叉树遍历

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502254 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在贴点代码. 2002年我初中二年级,开始学习BASIC语言.2004年中考之后,开始参加NOIP,系统学习算法.一直非常喜欢算法,但工作后几乎不再碰这些东西.现在准备重新捡起来. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofe

在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会写出更好的算法. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用