二叉排序树的构造、深度优先遍历、广度优先遍历

来源:互联网 发布:网络教研三剑客 编辑:程序博客网 时间:2024/06/08 14:50
        之前面试官总是会问到二叉树的遍历,自己回答的很不好。甚至可以说想都想不起来。真的应了老师应常说的那句话,你们学的东西都还给老师了啊。。。这两天在看mysql优化的时候看到了B树,然后去查阅B树的知识,又知道B树又跟二叉排序树脱不了关系。于是就整理了这篇关于二叉排序树的相关知识。
        首先我们知道,二叉排序树的特征有:(1)如果一个节点的左子树不空,那么左子树的所有节点的值均小于该节点的值;
                                                                     (2)如果一个节点的右子树不空,那么右子树的所有节点的值均大于该节点的值;
        1.构造排序二叉树的基本思想为(使用前序插入)
            (1)首先定义一个根节点,初始化为null
            (2)将插入的第一个元素通过节点类打包给根节点
            (3)将根节点赋给currentNode这个节点
            (4)继续插入元素,如果该元素大于currentNode.value,那么就将该元素赋给currentNode.right,把currentNode.right当作currentNode;否则将该元素赋给currentNode.left,把currentNode.left当作currentNode
            (5)重复(4)
       2.二叉树的遍历有两种方式:深度优先遍历、广度优先遍历
           2.1深度优先遍历

              沿着树的深度遍历二叉树。可以使用前序遍历(递归、非递归)、中序遍历(递归、非递归)、后续遍历(递归、非递归)

           2.2广度优先遍历

               一层一层的遍历,先访问一个节点,再访问该节点的邻接节点

      3.具体代码实现(参考文章http://blog.csdn.net/fantasy_lin_/article/details/52751559)
package Tree;import java.util.LinkedList;import java.util.Queue;/*Created By guolujie in 2017年9月15日 */public class MyTree {public static void main(String[] args) {// TODO Auto-generated method stubBinaryOrderTree<Integer> tree = new BinaryOrderTree<Integer>();tree.insertTreeNode(2);tree.insertTreeNode(1);tree.insertTreeNode(0);tree.insertTreeNode(9);tree.insertTreeNode(6);tree.insertTreeNode(7);tree.insertTreeNode(5);tree.insertTreeNode(8);tree.insertTreeNode(3);tree.insertTreeNode(4);System.out.print("前序遍历(递归):");tree.preOrderTraverse(tree.getRoot());System.out.println();System.out.print("中序遍历(递归):");tree.midOrderTraverse(tree.getRoot());System.out.println();System.out.print("后序遍历(递归):");tree.postOrderTraverse(tree.getRoot());System.out.println();System.out.print("前序遍历(非递归):");tree.preOrderTraverseNo(tree.getRoot());System.out.println();System.out.print("中序遍历(非递归):");tree.midOrderTraverseNo(tree.getRoot());System.out.println();System.out.print("后序遍历(非递归):");tree.postOrderTraverseNo(tree.getRoot());System.out.println();System.out.print("广度优先遍历:");tree.breadthFirstTraverse(tree.getRoot());}}//首先定义节点类class TreeNode<E extends Comparable<E>>{E value;TreeNode<E> left;TreeNode<E> right;TreeNode(E value){this.value = value;left = null;right = null;}}//通过前序插入节点,构造二叉排序树class BinaryOrderTree<E extends Comparable<E>>{private TreeNode<E> root;    BinaryOrderTree() {root=null;}        public void insertTreeNode(E value){    if(root==null)    {    root = new TreeNode<E>(value);    return;    }    TreeNode<E> currentNode = root;    while(true){    if(value.compareTo(currentNode.value)>0){    if(currentNode.right==null){    currentNode.right = new TreeNode<E>(value);    break;    }    currentNode = currentNode.right;    }    else{    if(currentNode.left==null){    currentNode.left = new TreeNode<E>(value);    break;    }    currentNode = currentNode.left;    }    }    }    public TreeNode<E> getRoot(){    return root;    }    //前序遍历(递归)    public void preOrderTraverse(TreeNode<E> node){    System.out.print(node.value+" ");    if(node.left!=null)    preOrderTraverse(node.left);    if(node.right!=null)    preOrderTraverse(node.right);    }    //中序遍历(递归)    public void midOrderTraverse(TreeNode<E> node){    if(node.left!=null)    midOrderTraverse(node.left);    System.out.print(node.value+" ");    if(node.right!=null)    midOrderTraverse(node.right);    }    //后序遍历(递归)    public void postOrderTraverse(TreeNode<E> node){    if(node.left!=null)    postOrderTraverse(node.left);    if(node.right!=null)    postOrderTraverse(node.right);    System.out.print(node.value+" ");    }    //前序遍历(非递归)    public void preOrderTraverseNo(TreeNode<E> root){    LinkedList<TreeNode<E>> list = new LinkedList<TreeNode<E>>();    TreeNode<E> currentNode = null;    list.push(root);    while(!list.isEmpty()){    currentNode = list.pop();    System.out.print(currentNode.value+" ");    if(currentNode.right!=null)    list.push(currentNode.right);    if(currentNode.left!=null)    list.push(currentNode.left);    }    }    public void midOrderTraverseNo(TreeNode<E> root){    LinkedList<TreeNode<E>> list = new LinkedList<TreeNode<E>>();    TreeNode<E> currentNode = root;    while(currentNode!=null||!list.isEmpty()){    while(currentNode!=null){    list.push(currentNode);    currentNode = currentNode.left;    }    currentNode = list.pop();    System.out.print(currentNode.value+" ");    currentNode = currentNode.right;    }    }    public void postOrderTraverseNo(TreeNode<E> root){    LinkedList<TreeNode<E>> list = new LinkedList<TreeNode<E>>();    TreeNode<E> currentNode = root;    TreeNode<E> rightNode = null;    while(currentNode!=null||!list.isEmpty()){    while(currentNode!=null){    list.push(currentNode);    currentNode = currentNode.left;    }    currentNode = list.pop();    while (currentNode.right == null || currentNode.right == rightNode) {    System.out.print(currentNode.value + " ");    rightNode = currentNode;    if (list.isEmpty()) {    return; //root以输出,则遍历结束    }    currentNode = list.pop();    }    list.push(currentNode); //还有右结点没有遍历    currentNode = currentNode.right;    }    }        //广度优先遍历,使用队列    public void breadthFirstTraverse(TreeNode<E> root){    Queue<TreeNode<E>> queue = new LinkedList<TreeNode<E>>();    TreeNode<E> currentNode = null;    queue.offer(root);    while(!queue.isEmpty()){    currentNode=queue.poll();    System.out.print(currentNode.value+" ");    if(currentNode.left!=null)    queue.offer(currentNode.left);    if(currentNode.right!=null)    queue.offer(currentNode.right);    }    } }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大便排不出去怎么办 婴儿三个没大便怎么办 三天不上大便怎么办 婴儿几天没大便怎么办 排便不好肚子大怎么办 三天不拉大便怎么办 几天不拉大便怎么办 七天不大便该怎么办 新生儿嘴巴很干怎么办 一岁宝宝过敏怎么办 母乳喂养宝宝不吃奶瓶怎么办 宝宝吃奶特别急怎么办 宝宝吃奶粉消化不良怎么办 喝羊奶大便干燥怎么办 宝宝换奶粉发烧怎么办 婴儿吃了蛋白怎么办 新生儿吃了蜂蜜怎么办 婴儿吃蜂蜜中毒怎么办 宝宝吃蜂蜜中毒怎么办 宝宝对蛋清过敏怎么办 宝宝吃蛋清过敏怎么办 婴儿吃蛋清过敏怎么办 初生婴儿拉水怎么办 婴儿鸡蛋过敏了怎么办 婴儿鸡蛋白过敏怎么办 母牛产后涨奶怎么办 宝宝吃奶时间长边吃边睡怎么办 宝宝吃海鲜过敏怎么办 小孩吃虾过敏怎么办 三个月婴儿不吃奶粉怎么办 宝宝秋季腹泻发烧怎么办 婴儿肚子有积食怎么办 小孩眼睛有点斜怎么办 孕妇血糖高便秘怎么办 宝宝蛋清过敏了怎么办 婴儿对鸡蛋过敏怎么办 宝宝断奶喝酸奶怎么办 宝宝被异物卡住怎么办 宝宝夜里膝盖痛怎么办 宝宝吃蛋白过敏怎么办 身体蛋白率低怎么办