二叉树遍历

来源:互联网 发布:angularjs 读取json 编辑:程序博客网 时间:2024/06/07 09:26

二叉树遍历

二叉树定义:

class TreeNode{        int val;//结点的值        TreeNode left;//左结点        TreeNode right;//右结点        public TreeNode(int val){            this.val = val;        }    }

前序遍历

前序遍历是先打印根结点值,再遍历左子树和右子树。
两种实现:
1. 递归实现,代码如下:

public static void preOrderTree(TreeNode root){        if(root == null)            return;        System.out.print(root.val+" ");        preOrderTree(root.left);        preOrderTree(root.right);}

2. 非递归实现,代码如下:

    public static void preOrderTree2(TreeNode root){        if(root == null)            return;        Stack<TreeNode> stack = new Stack<>();        while(root != null || !stack.isEmpty()){            while(root != null ){                System.out.print(root.val+" ");                stack.push(root);                root = root.left;            }            if(!stack.isEmpty()){                root = stack.pop();                root = root.right;            }        }    }

测试:

    public static void main(String[] args) {        TreeNode root = new TreeNode(8);        TreeNode node1 = new TreeNode(6);        TreeNode node2 = new TreeNode(10);        TreeNode node3 = new TreeNode(5);        TreeNode node4 = new TreeNode(7);        TreeNode node5 = new TreeNode(9);        TreeNode node6 = new TreeNode(11);        root.left = node1;        root.right = node2;        node1.left = node3;        node1.right = node4;        node2.left = node5;        node2.right = node6;//        preOrderTree(root);        preOrderTree2(root);    }

中序遍历

中序遍历是先遍历左子树,再遍历根结点和右子树。
两种实现:
1. 递归实现,代码如下:

public static void inOrderPrint(TreeNode root){        if(root == null)            return;        inOrderPrint(root.left);        System.out.print(root.val+" ");        inOrderPrint(root.right);    }

2. 非递归实现,代码如下:

public static void inOrderPrint2(TreeNode root){        if(root == null)            return;        Stack<TreeNode> stack = new Stack<>();        while(root != null || !stack.isEmpty()){            while(root != null){                stack.push(root);                root = root.left;            }            if(!stack.isEmpty()){                root = stack.pop();                System.out.println(root.val);                root = root.right;            }        }    }

后序遍历

后序遍历是先遍历左右子树,再遍历根结点。
代码实现:

public static void afterOrderTree(TreeNode root){        if(root == null)            return;        afterOrderTree(root.left);        afterOrderTree(root.right);        System.out.print(root.val+" ");    }