美文网首页
二叉树的基本算法

二叉树的基本算法

作者: 大聪明的博客 | 来源:发表于2022-04-08 15:19 被阅读0次

    一、二叉树的递归遍历

    1.先序遍历
        static class BitTree {
            int data;
            BitTree left;
            BitTree right;
        }
        static void visit(BitTree bitTree) {
         //访问节点
        }
      //使用递归方法遍历二叉树
        static void preOrder(BitTree bitTree) {
            if (bitTree != null) {
                visit(bitTree);
                preOrder(bitTree.left);
                preOrder(bitTree.right);
            }
        }
    2.中序遍历
      static void midOrder(BitTree bitTree) {
            if (bitTree != null) {
                midOrder(bitTree.left);
                visit(bitTree);
                midOrder(bitTree.right);
            }
        }
    3.后序遍历
        static void postOrder(BitTree bitTree) {
            if (bitTree != null) {
                postOrder(bitTree.left);
                postOrder(bitTree.right);
                visit(bitTree);
            }
        }
    
    

    二、二叉树的层次遍历

    二叉树的层次遍历是指二叉树从上到下,从左到右遍历数据。同一层中的节点访问完了,接着访问下一层级的元素。先遇到的节点先访问,后遇到的节点后访问,访问顺利类似队列。所以针对每一个节点的访问顺序是
    1.先访问 当前节点的数据;
    2.如果当前节点有左孩子,左孩子入队;
    3.如果当前节点有右孩子,右孩子入队;

          static void levelOrder(BitTree bitTree){
            //这里的数组长度是情况而定,写Int最大值是随意的。
            BitTree[] queue = new BitTree[Integer.MAX_VALUE];
            int font,rear;
            if (bitTree==null)return;
            font = -1;
            rear=0;
            //根节点入队
            queue[rear] = bitTree;
            while (font!=rear){
                font++;
                //访问出队节点
                visit(queue[font]);
                //出队节点的左孩子不为null就把左孩子入队
                if (queue[font].left!=null){
                    rear++;
                    queue[rear] = queue[font].left;
                }
                //出队节点的右孩子不为null就把右孩子入队
                if (queue[font].right!=null){
                    rear++;
                    queue[rear] = queue[font].right;
                }
            }
        }
    

    三、二叉树的非递归遍历

    中序遍历的非递归算法:访问节点时先访问其左孩子,再访问该节点,最后访问右孩子。
    中序遍历的时候我们先从根节点的左孩子开始,一直深入孩子节点的左孩子,直到节点的左孩子为空返回,访问该节点。

        //中序遍历的非递归算法
        static void nrInOrder(BitTree bitTree){
            //加入100的长度够用
            int maxLength =100;
            BitTree[] bitTrees = new BitTree[maxLength];
            BitTree p = bitTree;
            int top = -1;
            //根节点为null,直接return;
            if (bitTree==null)return;
            while (!(top==0 && p==null)){
                while (p!=null){
                    if (top < maxLength-1)bitTrees[++top]=p;
                    p = p.left;
                }
                if (top==-1)return;
                else {
                    p = bitTrees[top--];
                    visit(p);
                    p = p.right;
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:二叉树的基本算法

          本文链接:https://www.haomeiwen.com/subject/quvodrtx.html