二叉树的深度优先与广度优先算法

来源:互联网 发布:淘宝客服兼职 靠谱吗 编辑:程序博客网 时间:2024/06/05 05:18
<span style="font-family: Arial, Helvetica, sans-serif;">package org.zbus.test;</span>
import java.util.ArrayDeque;public class BinaryTree {    static class TreeNode{        int value;        TreeNode left;        TreeNode right;        public TreeNode(int value){            this.value=value;        }    }    TreeNode root;    public BinaryTree(int[] array){        root=makeBinaryTreeByArray(array,1);    }    /**     * 采用递归的方式创建一颗二叉树     * 传入的是二叉树的数组表示法     * 构造后是二叉树的二叉链表表示法     */    public static TreeNode makeBinaryTreeByArray(int[] array,int index){        if(index<array.length){            int value=array[index];            if(value!=0){                TreeNode t=new TreeNode(value);                array[index]=0;                t.left=makeBinaryTreeByArray(array,index*2);                t.right=makeBinaryTreeByArray(array,index*2+1);                return t;            }        }        return null;    }    /**     * 深度优先遍历,相当于先根遍历     * 采用非递归实现     * 需要辅助数据结构:栈     */    public void depthOrderTraversal(){        if(root==null){            System.out.println("empty tree");            return;        }               ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();        stack.push(root);               while(stack.isEmpty()==false){            TreeNode node=stack.pop();            System.out.print(node.value+"    ");            if(node.right!=null){                stack.push(node.right);            }            if(node.left!=null){                stack.push(node.left);            }                   }        System.out.print("\n");    }    /**     * 广度优先遍历     * 采用非递归实现     * 需要辅助数据结构:队列     */    public void levelOrderTraversal(){        if(root==null){            System.out.println("empty tree");            return;        }        ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();        queue.add(root);        while(queue.isEmpty()==false){            TreeNode node=queue.remove();            System.out.print(node.value+"    ");            if(node.left!=null){                queue.add(node.left);            }            if(node.right!=null){                queue.add(node.right);            }        }        System.out.print("\n");    }    /**      *                  13     *                 /  \     *               65    5     *              /  \    \     *             97  25   37     *            /    /\   /     *           22   4 28 32     */    public static void main(String[] args) {        int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};        BinaryTree tree=new BinaryTree(arr);        tree.depthOrderTraversal();        tree.levelOrderTraversal();    }}

二叉树的深度优先遍历和先序遍历结果一样的。 思想是采用栈, 首先将根结点压入栈,如果栈不为空,而后出栈并输出当前结点中值,而后先把右子树压入栈,再把左子树压入栈,再判断栈是否为空,循环.....

步骤如下:

(1) 树的根结点入栈

(2)判断栈是否为空,不为空,则出栈,并输出出栈树结点的值

(3)出栈树结点的右子树入栈

(4)出栈树结点的左子树入栈

(5)循环回到(2)


二叉树广义优先遍历为层遍历(从左到右)。思想就是采用队列,步骤如下:

(1) 树的根结点入队

(2)判断队列是否为空,不为空,则出队,并输出出队树结点的值

(3)出队树结点的左子树进入队列

(4)出队树结点的右子树进入队列

(5)循环回到(2)


0 0
原创粉丝点击