二叉树的创建及各种遍历操作

创建二叉树时使用的是扩展二叉树,即将叶子节点的孩子补成#,用作标记,如下所示:
这里写图片描述
在以前序方式创建二叉树的时候需要输入:ab#d##c#e##。

class TreeNode {
    char data;
    TreeNode left;
    TreeNode right;
}
public class Tree {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str=scanner.nextLine();
        Queue queue=new LinkedList<>();
        for(int i=0;i<str.length();i++) {
           queue.offer(str.charAt(i));
        }
        TreeNode root=createBinaryTree(queue);

        System.out.print("前序遍历:");
        print_preTree(root);
        System.out.print("\n中序遍历:");
        print_midTree(root);
        System.out.print("\n后序遍历:");
        print_postTree(root);
        System.out.print("\n层次遍历:");
        print_levelTree(root);
    }

    /**
     * 创建二叉树,前序方式
     * @return
     */
    static TreeNode createBinaryTree(Queue queue) {
        TreeNode node;
        char ch=(char)queue.poll();
        if(ch=='#') {
            node=null;
        }
        else {
            node=new TreeNode();
            node.data=ch;
            node.left=createBinaryTree(queue);
            node.right=createBinaryTree(queue);
        }

        return node;
    }
    /**
     * 递归实现二叉树前序遍历
     * @param node
     */
    static void print_preTree(TreeNode node) {
        if(node!=null) {
            System.out.print(node.data);
            print_preTree(node.left);
            print_preTree(node.right);
        }
    }
    /**
     * 递归实现二叉树中序遍历
     * @param node
     */
    static void print_midTree(TreeNode node) {
        if(node!=null) {
            print_midTree(node.left);
            System.out.print(node.data);
            print_midTree(node.right);
        }
    }
    /**
     * 递归实现二叉树后序遍历
     * @param node
     */
    static void print_postTree(TreeNode node) {
        if(node!=null) {
            print_postTree(node.left);
            print_postTree(node.right);
            System.out.print(node.data);
        }
    }
    /**
     * 二叉树层次遍历
     * @param node
     */
    static void print_levelTree(TreeNode node) {
        if(node!=null) {
            Queue<TreeNode> nodeQueue=new LinkedList<TreeNode>();
            nodeQueue.offer(node);
            while(!nodeQueue.isEmpty()) {
                TreeNode treeNode=nodeQueue.poll();
                System.out.print(treeNode.data);
                if(treeNode.left!=null) {
                    nodeQueue.offer(treeNode.left);
                }
                if(treeNode.right!=null) {
                    nodeQueue.offer(treeNode.right);
                }
            }
        }
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值