龙空技术网

数据结构与算法:二叉树的深度优先遍历

日拱一卒程序猿 112

前言:

现时同学们对“求解二叉树深度的算法”大概比较讲究,兄弟们都想要了解一些“求解二叉树深度的算法”的相关内容。那么小编在网络上汇集了一些有关“求解二叉树深度的算法””的相关文章,希望看官们能喜欢,大家一起来了解一下吧!

一、二叉树的遍历

二叉树,是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同。

二叉树的遍历包括深度优先遍历和广度优先遍历。

二、深度优先遍历

所谓深度优先,顾名思义,就是偏向于纵深,“一头扎到底”的访问方式。

1、前序遍历

二叉树的前序遍历,输出顺序是根节点、左子树、右子树。

步骤如下:

1、首先输出的是根节点1;

2、由于根节点1存在左孩子,输出左孩子节点2;

3、由于节点2也存在左孩子,输出左孩子节点4;

4、节点4既没有左孩子,也没有右孩子,那么回到节点2,输出节点2的右孩子节点5;

5、节点5既没有左孩子,也没有右孩子,那么回到节点1,输出节点1的右孩子节点3;

6、节点3没有左孩子,但是有右孩子,因此输出节点3的右孩子节点6;

到此为止,所有的节点都遍历输出完毕。

2、中序遍历

二叉树的中序遍历,输出顺序是左子树、根节点、右子树。

步骤如下:

1、首先访问根节点的左孩子,如果这个左孩子还拥有左孩子,则继续深入访问下去,一直找到不 再有左孩子 的节点,并输出该节点。显然,第一个没有左孩子的节点是节点4;

2、依照中序遍历的次序,接下来输出节点4的父节点2;

3、再输出节点2的右孩子节点5;

4、以节点2为根的左子树已经输出完毕,这时再输出整个二叉树的根节点1;

5、由于节点3没有左孩子,所以直接输出根节点1的右孩子节点3;

6、最后输出节点3的右孩子节点6 到此为止,所有的节点都遍历输出完毕。

3、后序遍历

二叉树的后序遍历,输出顺序是左子树、右子树、根节点。

步骤如下:

1、首先访问根节点的左孩子,如果这个左孩子还拥有左孩子,则继续深入访问下去,一直找到不 再有左孩子 的节点,并输出该节点。显然,第一个没有左孩子的节点是节点4;

2、输出右节点5;

3、输出节点4的父节点2;

4、以节点2为根的左子树已经输出完毕,这时再输出整个二叉树的右子树;

5、访问根节点的右孩子,如果这个右孩子拥有左孩子,则继续深入访问下去,一直找到不再有左 孩子 的节点,如果没有左孩子则找右孩子,并输出该节点6;

6、输出节点6的父节点3 到此为止,所有的节点都遍历输出完毕。

三、代码实现

public class TreeNode {    int data; //数据    TreeNode leftChild; //左孩子    TreeNode rightChild; //右孩子    TreeNode(int data) {        this.data = data;    }}
public class BinaryTree {    TreeNode root;    public void insertNode(int data){        root=insert(root,data);    }    private TreeNode insert(TreeNode node,int data){        //如果是空则插入第一个节点        if(node==null){            return new TreeNode(data);        }        //插左边        if(data<node.data){            node.leftChild=insert(node.leftChild,data);        }        //插右边        else if(data>node.data){            node.rightChild=insert(node.rightChild,data);        }        else{            node.data=data;        }        return node;    }    /*     * 前序遍历     */    public void preOrderTraveral(TreeNode node){        if(node == null){            return;        }        System.out.println(node.data);        preOrderTraveral(node.leftChild);        preOrderTraveral(node.rightChild);    }    /*     * 中序遍历     */    public void inOrderTraveral(TreeNode node){        if(node == null){            return;        }        inOrderTraveral(node.leftChild);        System.out.println(node.data);        inOrderTraveral(node.rightChild);    }    /*     * 后序遍历     */    public void postOrderTraveral(TreeNode node){        if(node == null){            return;        }        postOrderTraveral(node.leftChild);        postOrderTraveral(node.rightChild);        System.out.println(node.data);    }    public static void main(String[] args) {        BinaryTree btt=new BinaryTree();        btt.insertNode(10);        btt.insertNode(8);        btt.insertNode(11);        btt.insertNode(7);        btt.insertNode(9);        btt.insertNode(12);        btt.preOrderTraveral(btt.root);        System.out.println("========================");        btt.inOrderTraveral(btt.root);        System.out.println("========================");        btt.postOrderTraveral(btt.root);    }}

标签: #求解二叉树深度的算法