当前位置: 移动技术网 > IT编程>开发语言>Java > 常见算法总结 - 二叉树篇

常见算法总结 - 二叉树篇

2020年05月04日  | 移动技术网IT编程  | 我要评论

本文总结了常见高频的关于二叉树的算法考察。

1.计算一个给定二叉树的叶子节点数目。

可以采用递归的方式进行累加

public static int calculatetreenodenumber(treenode treenode) {

        if (treenode == null) {
            return 0;
        }

        return calculatetreenodenumber(treenode.left) + calculatetreenodenumber(treenode.right) + 1;

}

2.计算二叉树的深度。

跟上题一样采用递归的方式,但需返回左右子树中较深的深度。

public static int gettreedepth(treenode tree) {

        if (tree == null) {
            return 0;
        }

        int left = gettreedepth(tree.left);
        int right = gettreedepth(tree.right);

        return left >= right ? left + 1 : right + 1;
}

3.如何打印二叉树每层的节点。

借助一个队列,先把根节点入队,每打印一个节点的值时,也就是打印队列头的节点时,都会把它的的左右孩子入队,并且把该节点出队。直到队列为空。

public static void printbylevel(treenode tree) {
        if (tree == null) {
            return;
        }

        linkedlist<treenode> queue = new linkedlist<>();
        queue.add(tree);
        
        while (!queue.isempty()) {
            treenode pop = queue.pop();
            system.out.println(pop.val);
            if (pop.left != null) {
                queue.add(pop.left);
            }
            if (pop.right != null) {
                queue.add(pop.right);
            }
        }

}

4.二叉树的z型遍历。

借助两个队列,一个正序打印,一个逆序打印。

 public static void printbyz(treenode tree) {

        if (tree == null) {
            return;
        }

        list<treenode> orderqueue = new arraylist<>();
        list<treenode> disorderqueue = new arraylist<>();

        orderqueue.add(tree);

        while (!orderqueue.isempty()|| !disorderqueue.isempty()) {
            if (!orderqueue.isempty()) {
              for (int i = 0; i < orderqueue.size(); i++) {
                    treenode leaf = orderqueue.get(i);
                    if (leaf.left != null) {
                        disorderqueue.add(leaf.left);
                    }
                    if (leaf.right != null) {
                        disorderqueue.add(leaf.right);
                    }
                }

                for (treenode node : orderqueue) {
                    system.out.println(node.val);
                }
                orderqueue.clear();
              
            }


            if (!disorderqueue.isempty()) {

                for (int i = 0; i < disorderqueue.size(); i++) {
                    treenode leaf = disorderqueue.get(i);
                    if (leaf.left != null) {
                        orderqueue.add(leaf.left);
                    }
                    if (leaf.right != null) {
                        orderqueue.add(leaf.right);
                    }
                }

                for (int i = disorderqueue.size()-1; i >=0 ; i--) {
                    treenode leaf = disorderqueue.get(i);
                    system.out.println(leaf.val);
                }
                disorderqueue.clear();
            }
        }

    }

5.一个已经构建好的treeset,怎么完成倒排序。

递归更换左右子树即可

public static void reverse(treenode tree) {

        if (tree.left == null && tree.right == null) {
            return;
        }

        treenode tmp = tree.right;

        tree.right = tree.left;
        tree.left = tmp;

        reverse(tree.left);
        reverse(tree.right);

}

6.二叉树的前序遍历。

前序递归

public static void preorderrecursion(treenode tree) {

    if (tree != null) {
        system.out.print(tree.val + "->");
        preorderrecursion(tree.left);
        preorderrecursion(tree.right);
    }

}

前序非递归

public static void preordernonrecursion(treenode tree) {

        stack<treenode> stack = new stack<>();
        treenode node = tree;
        while (node != null || !stack.empty()) {
            if (node != null) {
                system.out.print(node.val + "->");
                stack.push(node);
                node = node.left;
            } else {
                treenode tem = stack.pop();
                node = tem.right;
            }
        }
    }

7.二叉树的中序遍历。

中序递归

public static void middleorderrecursion(treenode tree) {

        if (tree != null) {
            middleorderrecursion(tree.left);
            system.out.print(tree.val + "->");
            middleorderrecursion(tree.right);
        }

}

中序非递归

public static void middleordernonrecursion(treenode tree) {

        stack<treenode> stack = new stack<>();
        treenode node = tree;
        while (node != null || !stack.isempty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                treenode tem = stack.pop();
                system.out.print(tem.val + "->");
                node = tem.right;
            }
        }

    }

8.二叉树的后序遍历。

后序递归

public static void postordertraverserecursion(treenode root) {
        if (root != null) {
            postordertraverserecursion(root.left);
            postordertraverserecursion(root.right);
            system.out.print(root.val + "->");
        }
}

后序非递归

public static void postordertraversenonrecursion1(treenode root) {

        linkedlist<treenode> stack = new linkedlist<>();
        linkedlist<treenode> output = new linkedlist<>();
        if (root == null) {
            return;
        }

        stack.add(root);
        while (!stack.isempty()) {

            treenode node = stack.polllast();
            output.addfirst(node);

            if (node.left != null) {
                stack.add(node.left);
            }
            if (node.right != null) {
                stack.add(node.right);
            }
        }

        for (treenode node : output) {
            system.out.print(node.val + "->");
        }

}
笔者个人总结,如有错误之处望不吝指出。

本文转自我的个人博客:《》
欢迎加入java后端架构技术讨论群:1398880
我的公众号:coderv的进阶笔记,记录技术心得
qrcode

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网