一.上机内容
1、熟悉二叉树基本概念和存储结构,在实现二叉树的二叉链表存储结构。
2、通过递归的方式实现二叉树的前、中、后序遍历算法,并对算法及思想简单应用,解决二叉树中的其它应用和实际问题中的应用。
3、求二叉树的深度
4、编写递归算法,计算二叉树中叶子结点的数目。
5*、通过非递归遍历的的方式实现二叉树的前、中、后序遍历算法和层次遍历算法。
6*、字符串的最长前缀匹配问题
二.代码实现
1、熟悉二叉树基本概念和存储结构,在实现二叉树的二叉链表存储结构。
// 内部节点类
public class BiTreeNode<T>{
// 结点的数据域
public T data;
// 左右节点
public BiTreeNode left,right;
// 构造方法
public BiTreeNode(T data, BiTreeNode left, BiTreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
}
// 二叉链式存储结构下的二叉树
public class BiTree <T>{
// 树的根节点
private BiTreeNode root;
// 构造方法
public BiTree(){
this.root = null;
}
public BiTree(BiTreeNode root) {
this.root = root;
}
}
2、通过递归的方式实现二叉树的前、中、后序遍历算法,并对算法及思想简单应用,解决二叉树中的其它应用和实际问题中的应用。
/**
* 先序遍历二叉树的递归算法
* @param T
*/
public void preRootTraverse(BiTreeNode T){
if (T != null){
// 先访问根节点
System.out.println(T.data);
// 再访问左子节点
postRootTraverse(T.left);
// 再访问右子节点
postRootTraverse(T.right);
}
}
/**
* 中序遍历二叉树的递归算法
* @param T
*/
public void inRootTraverse(BiTreeNode T){
if (T != null){
// 先访问左子节点
inRootTraverse(T.left);
// 再访问根节点
System.out.println(T.data);
// 在访问右子节点
inRootTraverse(T.right);
}
}
/**
* 后序遍历二叉树的递归算法
* @param T
*/
public void postRootTraverse(BiTreeNode T){
if (T != null){
// 先访问左子树
postRootTraverse(T.left);
// 再访问右子树
postRootTraverse(T.right);
// 再访问根节点
System.out.println(T.data);
}
}
3、求二叉树的深度
/**
* 求二叉树的深度 (递归)
* @param T
* @return
*/
public int getDepth(BiTreeNode T){
if(T != null){
int leftDepth = getDepth(T.left);
int rightDepth = getDepth(T.right);
return 1 + (leftDepth > rightDepth ? leftDepth:rightDepth);
}
return 0;
}
4、编写递归算法,计算二叉树中叶子结点的数目。
/**
* 计算节点个数(递归)
* @param T
* @return
*/
public int countNode(BiTreeNode T){
// 采用先序遍历的方式对二叉树进行遍历,并计算其节点个数
int count = 0;
if (T != null){
count++;
count += countNode(T.left);
count += countNode(T.right);
}
return count;
}
5*、通过非递归遍历的的方式实现二叉树的前、中、后序遍历算法和层次遍历算法。
/**
* 先序遍历二叉树的非递归算法
*/
public void preRootTraverse(){
BiTreeNode T = root;
if (T != null){
// 构造一个栈
Stack stack = new Stack();
// 根节点入栈
stack.push(T);
while (!stack.isEmpty()){
// 移除栈顶节点,并访问其值
T = (BiTreeNode) stack.pop();
System.out.println(T.data);
while(T != null){
// 访问左子结点
if (T.left != null){
System.out.println(T.left.data);
}
// 右子节点非空入栈
if (T.right != null){
stack.push(T.right);
}
// 继续左子节点
T = T.left;
}
}
}
}
/**
* 中序遍历二叉树的非递归算法
*/
public void inRootTraverse(){
BiTreeNode T = root;
if (T != null){
// 构造一个栈
Stack stack = new Stack();
// 根节点入栈
stack.push(T);
while (!stack.isEmpty()){
while(stack.peek() != null){
// 将栈顶元素的左子节点压入栈中
stack.push(((BiTreeNode)stack.pop()).left);
}
// 空节点退栈
stack.pop();
if (!stack.isEmpty()){
// 移除栈顶元素返回其值
T = (BiTreeNode) stack.pop();
System.out.println(T.data);
// 节点右子节点入栈
stack.push(T.right);
}
}
}
}
/**
* 后序遍历二叉树的非递归算法
*/
public void postRootTraverse(){
BiTreeNode T = root;
if (T != null){
// 构造栈对象
Stack stack = new Stack();
// 根节点进栈
stack.push(T);
// 访问标记
Boolean flag;
// p指向刚被访问的节点
BiTreeNode p =null;
while (!stack.isEmpty()){
while (stack.peek() != null){
// 将栈顶的节点的左子节点入栈
stack.push(((BiTreeNode) stack.pop()).left);
}
// 空节点退栈
stack.pop();
while(!stack.isEmpty()){
// 查看栈顶元素
T = (BiTreeNode) stack.peek();
if (T.right == null || T.left == null){
// 访问节点
System.out.println(T.data);
// 移除栈顶元素
stack.pop();
// p指向刚被访问的节点
p = T;
// 访问标记
flag = true;
}else {
// 右子节点入栈
stack.push(T.right);
// 未访问标记
flag = false;
}
if (!flag){
break;
}
}
}
}
}
/**
* 层序遍历二叉树算法
*/
public void levelTraverse(){
BiTreeNode T = root;
if (T != null){
// 创建一个队列
Queue queue = new Queue();
// 根结点入队列
queue.enqueue(T);
while(!queue.isEmpty()){
T = (BiTreeNode)queue.dequeue();
// 访问节点
System.out.println(T.data);
// 左结点非空,入队列
if (T.left!=null){
queue.enqueue(T.left);
}
// 右节点非空,入队列
if (T.right != null){
queue.enqueue(T.right);
}
}
}
}
6*、字符串的最长前缀匹配问题