二叉树的递归遍历(java实现)
二叉树是数据结构中非常重要的一章,而二叉树的遍历是重中之重。本文记载了我构造二叉树并对一棵简单的二叉树进行前、中、后序遍历的经验,因为本人是新手,不足之处还请谅解,欢迎指正。
创建树类
package tree;
public class BinaryTree {
TreeNode root;
public BinaryTree(){
System.out.println("创建一棵树完成");
}
//设置根节点
public void setRoot(TreeNode root) {
this.root = root;
System.out.println("在树中成功创建了一个根节点");
}
}
创建节点类
package tree;
public class TreeNode {
//节点中具有value值,此处声明
int value;
//值的两端是左右节点的引用
TreeNode leftNode;
TreeNode rightNode;
//构造器,在声明一个节点时传值。
public TreeNode(int value){
this.value=value;
}
//创建一个节点的左节点
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
System.out.println("创建左节点完成");
}
//创建一个节点的右节点
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
System.out.println("创建右节点完成");
}
}
前序遍历
前序遍历首先遍历根节点,之后遍历左子树,最后遍历右子树。在遍历左右子树时,同样是按照前序遍历原则进行遍历。
以下是递归实现:
package tree;
public class BinaryTree {
TreeNode root;
public BinaryTree(){
System.out.println("创建一棵树完成");
}
//设置根节点
public void setRoot(TreeNode root) {
this.root = root;
System.out.println("在树中成功创建了一个根节点");
}
//前序遍历
public void frontShow(){
System.out.println("前序遍历的结果是: ");
root.frontShow();
System.out.println();
}
}
package tree;
public class TreeNode {
//节点中具有value值,此处声明
int value;
//值的两端是左右节点的引用
TreeNode leftNode;
TreeNode rightNode;
//构造器,在声明一个节点时传值。
public TreeNode(int value){
this.value=value;
}
//创建一个节点的左右节点
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
System.out.println("创建左节点完成");
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
System.out.println("创建右节点完成");
}
//前序遍历
public void frontShow(){
System.out.print(value);
if(leftNode!=null){
leftNode.frontShow();
}
if(rightNode!=null){
rightNode.frontShow();
}
}
}
package tree;
public class TestBinaryNode{
public static void main(String[] args) {
//创建一棵树
BinaryTree binaryTree=new BinaryTree();
//创建一个根节点
TreeNode root=new TreeNode(1);
//创建左节点
TreeNode leftNode=new TreeNode(2);
//创建右节点
TreeNode rightNode=new TreeNode(3);
//将root赋值给binaryTree的根节点
binaryTree.setRoot(root);
//给根节点root创建左右节点
root.setLeftNode(leftNode);
root.setRightNode(rightNode);
//继续给binaryTree树创建增加节点
leftNode.setLeftNode(new TreeNode(4));
leftNode.setRightNode(new TreeNode(5));
rightNode.setLeftNode(new TreeNode(6));
rightNode.setRightNode(new TreeNode(7));
//调用树的前序遍历方法
binaryTree.frontShow();
}
}
中序遍历
中序遍历首先遍历根节点的左子树,再遍历根节点,最后遍历右子树。在遍历左右子树时,同样是按照中序遍历原则进行遍历。
以下是递归实现:
package tree;
public class BinaryTree {
TreeNode root;
public BinaryTree(){
System.out.println("创建一棵树完成");
}
//设置根节点
public void setRoot(TreeNode root) {
this.root = root;
System.out.println("在树中成功创建了一个根节点");
}
//中序遍历
public void midShow(){
System.out.println("中序遍历的结果是: ");
root.midShow();
System.out.println();
}
}
package tree;
public class TreeNode {
//节点中具有value值,此处声明
int value;
//值的两端是左右节点的引用
TreeNode leftNode;
TreeNode rightNode;
//构造器,在声明一个节点时传值。
public TreeNode(int value){
this.value=value;
}
//创建一个节点的左右节点
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
System.out.println("创建左节点完成");
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
System.out.println("创建右节点完成");
}
//中序遍历
public void midShow(){
if(leftNode!=null){
leftNode.midShow();
}
System.out.print(value);
if(rightNode!=null){
rightNode.midShow();
}
}
}
package tree;
public class TestBinaryNode{
public static void main(String[] args) {
//创建一棵树
BinaryTree binaryTree=new BinaryTree();
//创建一个根节点
TreeNode root=new TreeNode(1);
//创建左节点
TreeNode leftNode=new TreeNode(2);
//创建右节点
TreeNode rightNode=new TreeNode(3);
//将root赋值给binaryTree的根节点
binaryTree.setRoot(root);
//给根节点root创建左右节点
root.setLeftNode(leftNode);
root.setRightNode(rightNode);
//继续给binaryTree树创建增加节点
leftNode.setLeftNode(new TreeNode(4));
leftNode.setRightNode(new TreeNode(5));
rightNode.setLeftNode(new TreeNode(6));
rightNode.setRightNode(new TreeNode(7));
//调用树的前序遍历方法
binaryTree.midShow();
}
}
后序遍历
后序遍历首先遍历根节点的左子树,再遍历右子树,最后遍历根节点。在遍历左右子树时,同样根据后序遍历的规则来进行遍历。
以下是递归实现:
```java
package tree;
public class BinaryTree {
TreeNode root;
public BinaryTree(){
System.out.println("创建一棵树完成");
}
//设置根节点
public void setRoot(TreeNode root) {
this.root = root;
System.out.println("在树中成功创建了一个根节点");
}
//后序遍历
public void afterShow(){
System.out.println("后序遍历的结果是: ");
root.afterShow();
System.out.println();
}
}
package tree;
public class TreeNode {
//节点中具有value值,此处声明
int value;
//值的两端是左右节点的引用
TreeNode leftNode;
TreeNode rightNode;
//构造器,在声明一个节点时传值。
public TreeNode(int value){
this.value=value;
}
//创建一个节点的左右节点
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
System.out.println("创建左节点完成");
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
System.out.println("创建右节点完成");
}
//后序遍历
public void afterShow(){
if (leftNode!=null){
leftNode.afterShow();
}
if (rightNode!=null){
rightNode.afterShow();
}
System.out.print(value);
}
}
package tree;
public class TestBinaryNode{
public static void main(String[] args) {
//创建一棵树
BinaryTree binaryTree=new BinaryTree();
//创建一个根节点
TreeNode root=new TreeNode(1);
//创建左节点
TreeNode leftNode=new TreeNode(2);
//创建右节点
TreeNode rightNode=new TreeNode(3);
//将root赋值给binaryTree的根节点
binaryTree.setRoot(root);
//给根节点root创建左右节点
root.setLeftNode(leftNode);
root.setRightNode(rightNode);
//继续给binaryTree树创建增加节点
leftNode.setLeftNode(new TreeNode(4));
leftNode.setRightNode(new TreeNode(5));
rightNode.setLeftNode(new TreeNode(6));
rightNode.setRightNode(new TreeNode(7));
//调用树的前序遍历方法
binaryTree.afterShow();
}
}
以下是我将前序、中序、后序遍历代码整合之后的运行图: