来源:互联网 发布:网络内容提供商股票 编辑:程序博客网 时间:2024/05/13 19:51

概述

树可以有两种定义方式,递归和非递归。

非递归定义

树有结点集合和连接每对结点的有向边结合 组成。

树的递归定义

要么树为空,要么由根和零个或者多个非空子树组成,每棵树的根都被来自于根的边连接。

树的性质

一个特殊的结点作为根,根节点没有父节点,没有子节点的是叶子结点。

除了根之外,每个结点都被来自另一结点的边直接连接,被指向的是孩子,另一端是父亲。

从根节点带每个结点的遍历路径只有一条,遍历所需走过的边数即为路径长度。

树中某个结点的深度是指由根节点到该节点的路径长度;树中结点的高度是指该节点到最深叶子结点的路径长度。

结点的大小是指该节点所拥有的子孙数(包括结点本省);根节点的大小即为树的大小。

树的遍历

前序遍历:先处理自身,然后处理孩子结点(自身->左子结点->右子节点)

后序遍历:先处理孩子结点,然后处理自身(左子结点->右子节点->自身)

中序遍历:先处理左子结点,然后是自身,最后是右子节点(左子结点->自身->右子节点)

遍历示例

树可以递归的进行遍历:
public void preOrder(){
System.out.println(ele);
if(left!=null){
left.preOrder();
}
if(right != null){
right.preOrder();
}
}
public void postOrder(){
if(left!=null){
left.postOrder();
}
if(right != null){
right.postOrder();
}
System.out.println(ele);
}
public void inOrder(){
if(left!=null){
left.inOrder();
}
System.out.println(ele);
if(right != null){
right.inOrder();
}
}

也可以使用栈来实现非递归的遍历,以后序遍历为例:
在遍历过程中,每个节点都会三次放入栈中。第三次弹出是表示该节点为当前要访问的结点。
这里写图片描述
栈中包含已经遍历但是未完成的结点,当将结点压入栈中,计数器的值为1、2、3时分别表示如下情况:我们要处理结点的左子树、要处理的右子树和自身

0 0
原创粉丝点击