java实现树的前序遍历,递归和非递归实现(简单明了)

代码复制粘贴可以直接运行,相关注释都写上了,中序和后序遍历同理,简单明了

package tree;
import java.util.ArrayList;
import java.util.Stack;
public  class java_tree {
    
    
    //先定义一个结点类,方便后续操作
     class TreeNode {
    
    
        int val;        //结点的值大小
        TreeNode left;  //左节点
        TreeNode right;  //右节点
        TreeNode(int x) {
    
    
            val = x;
        }
    }
   static TreeNode[] node = new TreeNode[10];//以数组形式定义一棵完全二叉树,作为java_tree的成员变量

    public void init() {
    
          //初始化方法,用来生成完全二叉树
        for (int i = 0;i < 10; i++) {
    
    
            node[i] = new TreeNode(i);
        }
        for (int i = 0;i < 10; i++) {
    
    
            if (i * 2 + 1 < 10)
                node[i].left = node[i * 2 + 1];
            if (i * 2 + 2 < 10)
                node[i].right = node[i * 2 + 2];
        }
    }
//----------------------------------------------前序遍历-----------------------------------------------------------------
//递归实现
    public void preOrder(TreeNode root) {
    
    
        if (root != null) {
    
    
            System.out.print(root.val + " ");
            preOrder(root.left);   //左结点遍历完了就遍历右结点。
            preOrder(root.right);
        }

    }
//非递归实现
        public ArrayList preOrder1(TreeNode root) {
    
    
            Stack<TreeNode> stack = new Stack<TreeNode>();
            ArrayList alist = new ArrayList(); //用来存放遍历结果
            TreeNode p = root;
            while (p != null || !stack.empty()) {
    
    
                while (p != null) {
    
         //这里while语句是一直遍历左结点,直到所有左结点遍历完
                    alist.add(p.val);
                    stack.push(p);
                    p = p.left;
                }
                if (!stack.empty()) {
    
        //到哪个结点遍历结束左边结点,就弹出这个这个结点,开始遍历又结点
                    TreeNode temp = stack.pop();
                    p = temp.right;
                }
            }
            return alist;
        }
//----------------------------------------------中序遍历-----------------------------------------------------------------
//----------------------------------------------后序遍历-----------------------------------------------------------------



    //测试方法
    public static void main(String[] args) {
    
    
        java_tree test=new java_tree();
        test.init();  //执行初始化方法
        System.out.print("前序遍历(递归):");
        test.preOrder(node[0]);   //前序,递归实现
        System.out.println();
        System.out.print("前序遍历(非递归):");
        System.out.println(test.preOrder1(node[0]));
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bookssea/article/details/111473160
今日推荐