二叉树的遍历

Posted 起个po名真费劲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历相关的知识,希望对你有一定的参考价值。

package com.hzins.suanfa;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
/**
 * 二叉树的遍历
 * 其实深度遍历就是前序、中序和后序
 * @author Administrator
 *
 */
public class TreeTraverse {
    public static void main(String[] args) {
        Node node0 = new Node(0);
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        node0.left = node1;
        node0.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
    }
    /**
     * 递归先序遍历
     * @param head
     */
    public static void preOrderRecur(Node head){
        if(head == null){
            return ;
        }
        System.out.print(head.value + " ");
        preOrderRecur(head.left);
        preOrderRecur(head.right);
    } 
    /**
     * 递归中序遍历
     * @param head
     */
    public static void inOrderRecur(Node head){
        if(head == null){
            return;
        }
        inOrderRecur(head.left);
        System.out.print(head.value + " ");
        inOrderRecur(head.right);
    }
    /**
     * 递归后序遍历
     * @param head
     */
    public static void posOrderRecur(Node head){
        if(head == null){
            return;
        }
        posOrderRecur(head.left);
        posOrderRecur(head.right);
        System.out.print(head.value + " ");
    }
    /**
     * 非递归先序遍历
     * 将head放入stack中
     * pop出来,打印出node值,如果此时node有right,则将right压入stack中,
     * 如果此时有left,则将left压入栈中
     * @param head
     */
    public static void pre(Node head){
        if(head == null){
            return;
        }
        Stack<Node> stack = new Stack<Node>();
        stack.push(head);
        while(!stack.isEmpty()){
            Node temp = stack.pop();
            System.out.println(temp + " ");
            if(temp.right != null){
                stack.push(temp.right);
            }
            if(temp.left != null){
                stack.push(temp.left);
            }
        }
    }
    /**
     * 非递归实现二叉树的中序遍历
     * 将head压入栈中,head的左节点赋值为cur,不断地压入cur,直到发现cur为空,此时stack中弹出一个节点,记为node
     * 打印node值,并将cur赋值为node.right
     * 当stack为空并且cur为空时,遍历停止
     * @param head
     */
    public static void in(Node head){
        if(head != null){
            Stack<Node> stack = new Stack<Node>();
            while(!stack.isEmpty() || head != null){
                if(head != null){
                    stack.push(head);
                    head = head.left;
                }
                else{
                    head = stack.pop();
                    System.out.println(head.value);
                    head = head.right;
                }
            }
        }
    }
    /**
     * 非递归实现二叉树的后续遍历
     * 申请两个栈,记为s1,s2
     * 将head节点放入s1中,将s1pop出来放入s2中,将pop出的左右孩子放入s1中,直到s1为空,将s2中的元素输出
     * @param haed
     */
    public static void pos(Node head){
        if(head != null){
            Stack<Node> s1 = new Stack<Node>();
            Stack<Node> s2 = new Stack<Node>();
            s1.push(head);
            while(!s1.isEmpty()){
                Node temp = s1.pop();
                if(temp.left != null){
                    s2.push(temp.left);
                }
                if(temp.right != null){
                    s2.push(temp.right);
                }
            }
            while(!s2.isEmpty()){
                System.out.print(s2.pop() + " ");
            }
        }
    }
    /**
     * 层级遍历
     */
    public static void ceng(Node head){
        if(head != null){
            Queue<Node> queue = new LinkedList<Node>();
            queue.offer(head);
            while(!queue.isEmpty()){
                Node temp = queue.poll();
                System.out.print(temp + " ");
                if(temp.left != null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
            }
            
        }
    }
}

 

以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历

讲透学烂二叉树:二叉树的遍历图解算法步骤及JS代码

二叉树(2.二叉树的遍历和实现)

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

代码题— 二叉树的层次遍历