风也温柔

计算机科学知识库

java二叉树算法 java分别使用递归和非递归方式实现二叉树的前序遍历

  二叉树的遍历方式有多种java二叉树算法前序遍历为其中一种,前序遍历的方式是按照根---左--右的顺序遍历的,即先遍历完所有的根,再遍历左,最后遍历右子树java二叉树算法,如下图

  前序遍历的理想结果是: 10, 6, 4, 8, 14, 12, 16

  下面使用代码来实现上面的遍历,代码分别使用递归和非递归的方法实现java二叉树算法 java分别使用递归和非递归方式实现二叉树的前序遍历,两者输出的结果一致

   package com.silverbox.user.web.htmdemo;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    /**
     * 二叉树的前序遍历的非递归和递归的实现
     * 
     * @author ssj
     *
     */
    public class PreList {
        public static void main(String[] args) {
            // 创建一颗二叉树
            TreeNode root = new TreeNode("10");
            TreeNode n6 = new TreeNode("6");
            TreeNode n14 = new TreeNode("14");
            n6.setParent(root);
            n14.setParent(root);
            root.setLeft(n6);
            root.setRight(n14);
    <p>![二叉树的中序遍历算法_java二叉树算法_二叉树遍历算法][1]

            TreeNode n4 = new TreeNode("4");
            TreeNode n8 = new TreeNode("8");
            n6.setLeft(n4);
            n6.setRight(n8);
            TreeNode n12 = new TreeNode("12");
            TreeNode n16 = new TreeNode("16");
            n14.setLeft(n12);
            n14.setRight(n16);
            System.out.println("---------递归遍历结果--------------------");
            List list = new ArrayList();
            preListDiGui(root, list);
            System.out.println(list);
            
            
            System.out.println("---------非递归遍历结果--------------------");
            List list2 = preList(root);
            System.out.println(list2);
        }
        /**
         * 递归前序遍历
         * 
         * @param root
    &emsp;&emsp;![二叉树遍历算法_二叉树的中序遍历算法_java二叉树算法][2]

         * @return
         */
        public static void preListDiGui(TreeNode root, List list) {
            if (root == null) {
                return;
            }
            list.add(root.name);
            preListDiGui(root.left, list);
            preListDiGui(root.right, list);
        }
        /**
         * 非递归前序遍历
         * 
         * @param root
         * @return
         */
        public static List preList(TreeNode root) {
            Stack sk = new Stack();
            List list = new ArrayList();
            TreeNode n = root;
            while (n != null) {
                // 从当前节点开始,一直往左方向前进
    &emsp;&emsp;

                while (n != null) {
                    // 输出当前节点
                    list.add(n.getName());
                    if (n.right != null) {
                        // 遇到右节点,入栈
                        sk.push(n.right);
                    }
                    n = n.left;
                }
                // 取出入栈的右节点
                while (!sk.empty()) {
                    TreeNode n2 = sk.pop();
                    list.add(n2.getName());
                    if (n2.right != null) {
                        sk.push(n2.right);
                    }
                    // 如果该节点存在左节点,先输出所有的左节点,即重复以上过程
                    if (n2.left != null) {
                        n = n2.left;
                        break;
                    }
                }
    &emsp;&emsp;

            }
            return list;
        }
    }
    /**
     * 树节点
     * @author ssj
     *
     */
    class TreeNode {
        public String name;
        public TreeNode left;
        public TreeNode right;
        public TreeNode parent = null;
        public boolean visitor=false;//标记该节点是否访问过
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public TreeNode getParent() {
    &emsp;&emsp;![二叉树遍历算法_二叉树的中序遍历算法_java二叉树算法][3]

            return parent;
        }
        public void setParent(TreeNode parent) {
            this.parent = parent;
        }
        public TreeNode(String name) {
            super();
            this.name = name;
        }
        public TreeNode getLeft() {
            return left;
        }
        public void setLeft(TreeNode left) {
            this.left = left;
        }
        public TreeNode getRight() {
            return right;
        }
        public void setRight(TreeNode right) {
            this.right = right;
        }

</p>
  运行结果

  二叉树遍历算法_二叉树的中序遍历算法_java二叉树算法

  文章来源:https://www.toutiao.com/a7016875464447197709/