有序二叉树实现及相关遍历

实现思路

  • 如果左子树不为空,那么左子树上的所有值都均小于它的根节点的值
  • 如果右子树不为空,那么右子树上的所有值都均大于或等于它的根节点的值
  • 左,右子树也为二叉排序树

二叉树节点定义

  • 当前节点值
  • 当前节点的左节点
  • 当前节点的右节点

代码如下,set与get方法省略

 /**
     * 当前节点的值
     */
    T data;
    /**
     * 当前节点的左节点
     */
    Node left;
    /**
     * 当前节点的右节点
     */
    Node right;

二叉树实现

  • 排序二叉树构建实现思路:

判断当前节点与新增的节点的大小,没有增加上,则变化当前节点为遍历的节点,继续遍历即可

  • 前,中,后排序,使用递归的方式(前中后都是根据root来的)
  • 层序遍历采用队列
package cn.gxm.binarytree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author GXM
 * @date 2019/5/13
 *
 * 排序二叉树相关实现
 */
public class Binarytree {
    private Node<Integer> root;

    public void insert(Integer data){
        Node<Integer> newNode = new Node<Integer>(data);
        if(root == null){
            root = newNode;
            return;
        }

        Node curNode = root;
        while (true){
            //小于当前节点去找左节点
            if((Integer)newNode.data < (Integer) curNode.data){
                if(curNode.left == null){
                    curNode.left = newNode;
                    break;
                }
                curNode = curNode.left;
            }else {
                //大于当前节点或者等于  都找找右节点
                if(curNode.right == null){
                    curNode.right = newNode;
                    break;
                }
                curNode = curNode.right;
            }
        }

    }

    /**
     * 根据数据构建有序二叉树
     * @param arr
     */
    public Node<Integer> buildTree(Integer []arr){
        for (Integer tmp : arr){
            insert(tmp);
        }
        return root;
    }

    /**
     * 前序遍历
     */
    public void preTraversing(Node<Integer> root){
        Node<Integer> cur = root;
        if (cur != null){
            System.out.print(cur.data);
            preTraversing(cur.left);
            preTraversing(cur.right);
        }
    }

    /**
     * 中序遍历
     */
    public void midTraversing(Node<Integer> root){
        Node<Integer> cur = root;
        if (cur != null){
            midTraversing(cur.left);
            System.out.print(cur.data);
            midTraversing(cur.right);
        }
    }

    /**
     * 后序遍历
     */
    public void postTraversing(Node<Integer> root){
        Node<Integer> cur = root;
        if (cur != null){
            postTraversing(cur.left);
            postTraversing(cur.right);
            System.out.print(cur.data);
        }
    }

    /**
     * 层序遍历
     * @param root
     */
    public void SequenceTraversing(Node<Integer> root){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        // 不空就一直取
        while (!queue.isEmpty()){
            // poll以后队列中就没有了,指针移到下一个node上,所以我们这里获取
            Node poll = queue.poll();
            System.out.print(poll.data);
            if(poll.left!=null){
                queue.add(poll.left);
            }
            if(poll.right!=null){
                queue.add(poll.right);
            }
        }
    }


   public static void main(String[] args) {
        Binarytree bt = new Binarytree();
        Node<Integer> root = bt.buildTree(new Integer[]{2, 8, 7, 4, 9, 3, 1, 6, 7, 5});
        System.out.println("前序");
        bt.preTraversing(root);

        System.out.println();
        System.out.println("中序");
        bt.midTraversing(root);

        System.out.println();
        System.out.println("后序");
        bt.postTraversing(root);

        System.out.println();
        System.out.println("层序");
        bt.SequenceTraversing(root);
    }
    }
}

结果

前序
2187436579
中序
1234567789
后序
1356477982
层序
2187947365

构建的有序二叉树如下
有序二叉树实现及相关遍历