二叉排序树

二叉排序树

主要记录了二叉排序数的建立,前中后便利(递归的和非递归的)。代码主要使用Java语言编写。如下所示:

import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static class TreeNode {
        int val;
        TreeNode lefTreeNode;
        TreeNode rightTreeNode;

        public TreeNode(int x) {
            val = x;
        }
    }

    public static class BinaryTree {
        TreeNode root;

        public BinaryTree(int root_data) {
            root = new TreeNode(root_data);
        }

        public void insert(int data) {
            TreeNode current_node = root;
            TreeNode before_node = root;
            while (current_node != null) {
                if (current_node.val < data) {
                    before_node = current_node;
                    current_node = current_node.rightTreeNode;
                } else {
                    before_node = current_node;
                    current_node = current_node.lefTreeNode;
                }
            }
            if (before_node.val < data) {
                before_node.rightTreeNode = new TreeNode(data);
            } else {
                before_node.lefTreeNode = new TreeNode(data);
            }
        }

        public void preOrder(TreeNode current_node) {
            if (current_node != null) {
                System.out.print(current_node.val + " ");
                this.preOrder(current_node.lefTreeNode);
                this.preOrder(current_node.rightTreeNode);
            }
        }

        public void noRecursionPreOrder() {
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.empty()) {
                TreeNode current_node = stack.pop();
                System.out.print(current_node.val + " ");
                if (current_node.rightTreeNode != null)
                    stack.push(current_node.rightTreeNode);
                if (current_node.lefTreeNode != null)
                    stack.push(current_node.lefTreeNode);
            }
        }

        public void inOrder(TreeNode current_node) {
            if (current_node != null) {
                this.inOrder(current_node.lefTreeNode);
                System.out.print(current_node.val + " ");
                this.inOrder(current_node.rightTreeNode);
            }
        }

        public void noRecursionInOrder() {
            Stack<TreeNode> stack = new Stack<>();
            TreeNode current_nodeNode = root;
            while (!stack.empty() || current_nodeNode != null) {
                while (current_nodeNode != null) {
                    stack.push(current_nodeNode);
                    current_nodeNode = current_nodeNode.lefTreeNode;
                }
                if (!stack.empty()) {
                    current_nodeNode = stack.pop();
                    System.out.print(current_nodeNode.val + " ");
                    current_nodeNode = current_nodeNode.rightTreeNode;
                }
            }
        }

        public void postOrder(TreeNode current_node) {
            if (current_node != null) {
                this.postOrder(current_node.lefTreeNode);
                this.postOrder(current_node.rightTreeNode);
                System.out.print(current_node.val + " ");
            }
        }

        public void noRecursionPostOrder() {
            Stack<TreeNode> stack = new Stack<>();
            Stack<TreeNode> outStack = new Stack<>();
            stack.push(root);
            while (!stack.empty()) {
                TreeNode current_node = stack.pop();
                outStack.push(current_node);
                if (current_node.lefTreeNode != null)
                    stack.push(current_node.lefTreeNode);
                if (current_node.rightTreeNode != null)
                    stack.push(current_node.rightTreeNode);
            }
            while (!outStack.empty()) {
                TreeNode currendNode = outStack.pop();
                System.out.print(currendNode.val + " ");
            }
        }

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arrays = new int[n];
        for (int i = 0; i < n; i++) {
            arrays[i] = scanner.nextInt();
        }

        BinaryTree binaryTree = new BinaryTree(arrays[0]);
        for (int i = 1; i < arrays.length; i++)
            binaryTree.insert(arrays[i]);
        // binaryTree.preOrder(binaryTree.root);
        // binaryTree.inOrder(binaryTree.root);
        // binaryTree.postOrder(binaryTree.root);
        // binaryTree.noRecursionPreOrder();
        //binaryTree.noRecursionInOrder();
         binaryTree.noRecursionPostOrder();
    }

}

测试数据

输入:

10
59 88 55 12 77 11 22 33 66 75

输出:

前序:59 55 12 11 22 33 88 77 66 75 
中序:11 12 22 33 55 59 66 75 77 88 
后序:11 33 22 12 55 75 66 77 88 59 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值