数据结构之二叉树:
-
树的最大层次称为树的深度
-
节点拥有的子树数量称为节点的度
-
度为0的节点都称为叶子节点
-
二叉树的定义: 每个节点至多只有两棵子树,(即二叉树中不存在大于度大于2的节点,并且二叉树的子树有左右之分)
-
二叉树的第i 层至多有 2^(i-1)个节点
-
深度为k 的二叉树至多有 2^k -1个节点
-
满二叉树: 一颗深度为 k 且 有 2^k -1个节点的二叉树称为满二叉树(完全对称) 除了叶子节点,其他每个节点都要两个子节点
-
完全二叉树: 所有叶子节点都在最后一层或者最后一层和倒数二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续
-
完全二叉树就是满二叉树从右到左依次删除节点
特殊的二叉树:
链式存储实现二叉树:
定义树节点:
public class TreeNode {
//节点的权
int value;
//左儿子
TreeNode leftNode;
//右儿子
TreeNode rightNode;
public TreeNode(int value) {
this.value = value;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
}
定义一颗二叉树:
public class BinaryTree {
TreeNode treeNode;
public TreeNode getTreeNode() {
return treeNode;
}
public void setTreeNode(TreeNode treeNode) {
this.treeNode = treeNode;
}
}
创建测试类:
创建二叉树:
public class BinaryTreeTest {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree(); //创建一个空树
TreeNode root = new TreeNode(1); //创建一个根节点,权值为1
binaryTree.setTreeNode(root); //设置数的根节点
TreeNode lNode1 = new TreeNode(2); //创建一个左节点
TreeNode rNode1 = new TreeNode(3); //创建一个右节点
root.setLeftNode(lNode1); //设置二叉树根节点的左节点
root.setRightNode(rNode1); //设置二叉树根节点的右节点
TreeNode lNode2 = new TreeNode(4);
TreeNode rNode2 = new TreeNode(5);
lNode1.setLeftNode(lNode2);
lNode1.setRightNode(rNode2);
rNode1.setLeftNode(new TreeNode(6));
rNode1.setRightNode(new TreeNode(7));
}
}
遍历二叉树:
遍历二叉树的方式有三种:
1、前序遍历:
若二叉树不为空,则
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树
代码实现:
在节点类中:
/*
* 前序遍历 先遍历根节点,再遍历左节点,再遍历右节点
* 递归实现
* 递归三部曲: 1、找递归终止条件 2、找返回值 3、希望本级递归做什么
* */
public void PreOrder(){
//先遍历此节点的数据
System.out.print(value+","); //本级递归打印节点的数据 如果是要返回值 可以是 return value
//遍历左节点
if(leftNode != null){ //当左节点为空时,左边遍历终止
leftNode.PreOrder();
}
//再遍历右节点
if(rightNode != null){ // 当右节点为空时, 右边遍历终止
rightNode.PreOrder();
}
}
在树类中实现:
/*
* 前序遍历 先遍历根节点,再遍历左节点,再遍历右节点
* */
public void PreOrderTree(TreeNode node){
System.out.print(node.value+",");
if(node.leftNode != null){
PreOrderTree(node.leftNode);
}
if(node.rightNode != null){
PreOrderTree(node.rightNode);
}
}
2、中序遍历:
若二叉树不为空,则
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
代码实现:
节点类中:
/*
* 中序遍历 先遍历左边节点 再遍历根节点 最后再遍历右节点
* */
public void InOrder(){
if(leftNode != null){
leftNode.InOrder();
}
System.out.print(value+",");
if(rightNode != null){
rightNode.InOrder();
}
}
在树类中:
/*
* 中序遍历
* */
public void InOrderTree(TreeNode node){
if(node.leftNode != null){
InOrderTree(node.leftNode);
}
System.out.print(node.value+",");
if(node.rightNode != null){
InOrderTree(node.rightNode);
}
}
3、后序遍历:
若树不为空,则
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
代码实现:
节点类中:
/*
* 后序遍历 先遍历左节点 再遍历右节点 再遍历根节点
* */
public void BeOrder(){
if(leftNode != null){
leftNode.BeOrder();
}
if(rightNode != null){
rightNode.BeOrder();
}
System.out.print(value +",");
}
树类中:
/*
* 后序遍历 左 右 根
* */
public void BeOrderTree(TreeNode node){
if(node.leftNode != null){
BeOrderTree(node.leftNode);
}
if(node.rightNode != null){
BeOrderTree(node.rightNode);
}
System.out.print(node.value+",");
}
以上就是二叉树的递归遍历实现。