二叉树遍历(递归)

 // 测试二叉树遍历,递归算法
    public class TestBinaryTree {
    public static void main(String[] args) {
    Node<String> g = new Node<String>("G", null, null);
    Node<String> e = new Node<String>("E", null, null);
    Node<String> f = new Node<String>("F", null, null);
    Node<String> d = new Node<String>("D", null, g);
    Node<String> b = new Node<String>("B", d, e);
    Node<String> c = new Node<String>("C", null, f);
    Node<String> a = new Node<String>("A", b, c);
    System.out.println("生成的二叉树:");
    System.out.println("            A");
    System.out.println("            |     ");
    System.out.println("       |---------|");
    System.out.println("       B         C");
    System.out.println("       |         |");
    System.out.println("  |---------|     -----|");
    System.out.println("  D         E          F");
    System.out.println("  |");
    System.out.println("   ----|");
    System.out.println("       G");
    System.out.println("二叉树深度:" + BinaryTree.getDepth(a));
    System.out.print("前序遍历:");
    BinaryTree.priorderTraversal(a);
    System.out.println();
    System.out.print("中序遍历:");
    BinaryTree.inorderTraversal(a);
    System.out.println();
    System.out.print("后序遍历:");
    BinaryTree.postorderTraversal(a);
    System.out.println();
    }
    }
    // 二叉树
    class BinaryTree {
    // 前序遍历
    static <T> void priorderTraversal(Node<T> node) {
    if (node != null) {
    visitNode(node);
    priorderTraversal(node.getLeftChild());
    priorderTraversal(node.getRightChild());
    }
    }
    // 中序遍历
    static <T> void inorderTraversal(Node<T> node) {
    if (node != null) {
    inorderTraversal(node.getLeftChild());
    visitNode(node);
    inorderTraversal(node.getRightChild());
    }
    }
    // 后序遍历
    static <T> void postorderTraversal(Node<T> node) {
    if (node != null) {
    postorderTraversal(node.getLeftChild());
    postorderTraversal(node.getRightChild());
    visitNode(node);
    }
    }
    // 二叉树深度
    static <T> int getDepth(Node<T> node) {
    if (node == null) {
    return 0;
    }
    int leftDepth = 0;
    int rightDepth = 0;
    leftDepth = getDepth(node.getLeftChild());
    rightDepth = getDepth(node.getRightChild());
    return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
    }
    // 访问节点
    static <T> void visitNode(Node<T> node) {
    System.out.print(node.getKey() + " ");
    }
    }
    // 节点
    class Node<T> {
    private T key;
    private Node<T> leftChild;
    private Node<T> rightChild;
    public Node() {
    }
    public Node(T key, Node<T> leftChild, Node<T> rightChild) {
    super();  www.2cto.com
    this.key = key;
    this.leftChild = leftChild;
    this.rightChild = rightChild;
    }
    public T getKey() {
    return key;
    }
    public void setKey(T key) {
    this.key = key;
    }
    public Node<T> getLeftChild() {
    return leftChild;
    }
    public void setLeftChild(Node<T> leftChild) {
    this.leftChild = leftChild;
    }
    public Node<T> getRightChild() {
    return rightChild;
    }
    public void setRightChild(Node<T> rightChild) {
    this.rightChild = rightChild;
    }
    }

 

    输出结果:
    生成的二叉树:
    A
    |
    |---------|
    B         C
    |         |
    |---------|     -----|
    D         E          F
    |
    ----|
    G
    二叉树深度:4
    前序遍历:A B D G E C F
    中序遍历:D G B E A C F
    后序遍历:G D E B F C A

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2013/05/04/3059406.html

时间: 2024-10-02 02:07:22

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

先序遍历二叉树的递归实现与非递归实现深入解析

以下是对先序遍历二叉树的递归实现与非递归实现进行了详细的分析介绍,需要的朋友可以过来参考下   1.先序遍历二叉树  递归实现思想:若二叉树为空,返回.否则 1)遍历根节点: 2)先序遍历左子树: 3)先序遍历右子树: 代码: 复制代码 代码如下: template<typename elemType> void PreOrder(nodeType<elemType> *root)  {      if(root==NULL)          return ;      visi

@数据结构大神:递归实现二叉树遍历,图示行为什么错?

问题描述 @数据结构大神:递归实现二叉树遍历,图示行为什么错? # include<stdio.h> # include<stdlib.h> # include<malloc.h> # define Max_Size 2 typedef struct Node{ int data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; int x,k=0,n=0; void CreateBiTree(Bi

c++ c 树-不用栈的非递归二叉树遍历 求改正 (C++新手)

问题描述 不用栈的非递归二叉树遍历 求改正 (C++新手) 原程序如下,添加了双亲域parent和标志域mark:不知道哪里不对: #include""iostream""using namespace std;class BinTree; class BinNode{private: int data; BinNode *lchild;BinNode *rchild;BinNode *parent;int mark;friend class BinTree; };

求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃

问题描述 求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃 #include #include #include typedef struct TNode { char date; struct TNode *lchild,*rchild; }TNode,*BiTree; typedef struct { BiTree top; BiTree *base; int stacksize; }Stack; int createBiTree(BiTree &S){ char ch

C语言二叉树非递归遍历问题

问题描述 C语言二叉树非递归遍历问题 #include"stdio.h" #include"stdlib.h" #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef int Stat

@数据结构大神:递归实现二叉树遍历,46、477行为什么错?

问题描述 @数据结构大神:递归实现二叉树遍历,46.477行为什么错? # include<stdio.h> # include<stdlib.h> # include<malloc.h> # define Max_Size 2 typedef struct Node{ int data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; int x,k=0; void CreateBiTree(Bi

@数据结构大神:递归实现二叉树遍历,38行为什么错?

问题描述 @数据结构大神:递归实现二叉树遍历,38行为什么错? # include<stdio.h> # include<stdlib.h> # include<malloc.h> # define Max_Size 3 typedef struct Node{ int data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; int x,k=0; void CreateBiTree(BiTree

C++实现二叉树非递归遍历方法实例总结_C 语言

一般来说,二叉树的遍历是C++程序员在面试中经常考察的,其实前中后三种顺序的遍历都大同小异,自己模拟两个栈用笔画画是不难写出代码的.现举一个非递归遍历的方法如下,供大家参考. 具体代码如下: class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> out; stack<TreeNode*> s; s.push(root); while(!s.empty()

先序遍历二叉树的递归实现与非递归实现深入解析_C 语言

1.先序遍历二叉树  递归实现思想:若二叉树为空,返回.否则 1)遍历根节点:2)先序遍历左子树:3)先序遍历右子树: 代码: 复制代码 代码如下: template<typename elemType> void PreOrder(nodeType<elemType> *root)  {      if(root==NULL)          return ;      visit(root->data); // visit the data    PreOrder(ro