数据结构之二叉树的遍历(前序,中序,后序)

1、构建二叉树的节点,二叉树的每个父节点最多只有连个子节点(左孩子,右孩子)

public class TreeNode<T> {

private T t; 
private TreeNode<T> rightNode;
private TreeNode<T> leftNode;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public TreeNode<T> getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode<T> rightNode) {
this.rightNode = rightNode;
}
public TreeNode<T> getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode<T> leftNode) {
this.leftNode = leftNode;
}

public TreeNode(T t) {
super();
this.t = t;
}
public TreeNode() {
super();
}

}


2、构建二叉树

public class Tree<T> {

private TreeNode<T> rootNode;

/**
* 给目标节点添加右孩子节点
* @param parentNode
* @param childNode
* @return
*/
public boolean addRightChild(TreeNode<T> parentNode,TreeNode<T> childNode) {
if(null == parentNode.getRightNode()){
parentNode.setRightNode(childNode);
}else {
System.out.println("该节点右孩子已经存在");
return false;
}
return true; 
}

/**
* 给目标节点添加左孩子节点
* @param parentNode
* @param childNode
* @return
*/
public boolean addLeftChild(TreeNode<T> parentNode,TreeNode<T> childNode) {
if(null == parentNode.getLeftNode()){
parentNode.setLeftNode(childNode);
}else {
System.out.println("该节点左孩子已经存在");
return false;
}
return true; 
}



/**
* 先序访问   先访问根节点,然后访问左子树,最后访问右子树
* @param rootTreeNode
*/
public void preIterator(TreeNode<T> rootTreeNode) {
if(null == rootTreeNode) {
System.out.println("这是一个空树");
}else {

System.out.println(rootTreeNode.getT());

if(null !=rootTreeNode.getLeftNode()) {
preIterator(rootTreeNode.getLeftNode());
}

if(null != rootTreeNode.getRightNode()) {
preIterator(rootTreeNode.getRightNode());
}
}
}

/**
* 中序访问    先访问左子树,然后访问根节点  ,最后访问右子树
* @param rootTreeNode
*/
public  void inIterator(TreeNode<T> rootTreeNode) {
if(null == rootTreeNode) {
System.out.println("这是一个空树");
}else {
if(null !=rootTreeNode.getLeftNode()) {
inIterator(rootTreeNode.getLeftNode());


System.out.println(rootTreeNode.getT());

if(null != rootTreeNode.getRightNode()) {
inIterator(rootTreeNode.getRightNode());
}
}
}


/**
* 后序访问   先访问左子树,然后访问右子树,最后访问根节点
* @param rootTreeNode
*/
public  void postIterator(TreeNode<T> rootTreeNode) {
if(null == rootTreeNode) {
System.out.println("这是一个空树");
}else {
if(null !=rootTreeNode.getLeftNode()) {
postIterator(rootTreeNode.getLeftNode());
}

if(null != rootTreeNode.getRightNode()) {
postIterator(rootTreeNode.getRightNode());
}

System.out.println(rootTreeNode.getT());
}
}
 
/**
* 有参数构造方法可以直接将外部构建好的树传递进来进行遍历
* @param rootNode
*/
public Tree(TreeNode<T> rootNode) {
super();
this.rootNode = rootNode;
}



public Tree() {
super();
}


public TreeNode<T> getRootNode() {
return rootNode;
}


public void setRootNode(TreeNode<T> rootNode) {
this.rootNode = rootNode;
}

}

3、测试二叉树的遍历

public class TestTree {


@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
Person person1  = new Person("刘德华", 18, '男');
Person person2  = new Person("张学友", 19, '男');
Person person3  = new Person("谭咏麟", 20, '男');
Person person4  = new Person("张国荣", 21, '男');
Person person5  = new Person("陈百强", 22, '男');
Person person6  = new Person("梅艳芳", 23, '女');
Person person7  = new Person("郑秀文", 24, '女');
Person person8  = new Person("林忆莲", 25, '女');
Person person9  = new Person("孙燕姿", 26, '女');

TreeNode<Person> node1 = new TreeNode<>(person1);
TreeNode<Person> node2 = new TreeNode<>(person2);
TreeNode<Person> node3 = new TreeNode<>(person3);
TreeNode<Person> node4 = new TreeNode<>(person4);
TreeNode<Person> node5 = new TreeNode<>(person5);
TreeNode<Person> node6 = new TreeNode<>(person6);
TreeNode<Person> node7 = new TreeNode<>(person7);
TreeNode<Person> node8 = new TreeNode<>(person8);
TreeNode<Person> node9 = new TreeNode<>(person9);

Tree tree = new Tree(node1);

tree.addLeftChild(node1,node2);
tree.addRightChild(node1, node3);
tree.addLeftChild(node2, node4);
tree.addLeftChild(node4, node5);
tree.addRightChild(node5, node6);
tree.addLeftChild(node5, node7);
tree.addLeftChild(node3, node8);
tree.addRightChild(node3, node9);
System.out.println("先序访问______________________________");
tree.preIterator(tree.getRootNode());
System.out.println("中序访问______________________________");
tree.inIterator(tree.getRootNode());
System.out.println("后序访问______________________________");
tree.postIterator(tree.getRootNode());

}

}


输出结果:**********************************************************************************************

根据二叉树的先序和中序或者中序和后序遍历结果变可以知道二叉树的结构

先序访问______________________________

Person [name=刘德华, age=18, sex=男]
Person [name=张学友, age=19, sex=男]
Person [name=张国荣, age=21, sex=男]
Person [name=陈百强, age=22, sex=男]
Person [name=郑秀文, age=24, sex=女]
Person [name=梅艳芳, age=23, sex=女]
Person [name=谭咏麟, age=20, sex=男]
Person [name=林忆莲, age=25, sex=女]
Person [name=孙燕姿, age=26, sex=女]
中序访问______________________________
Person [name=郑秀文, age=24, sex=女]
Person [name=陈百强, age=22, sex=男]
Person [name=梅艳芳, age=23, sex=女]
Person [name=张国荣, age=21, sex=男]
Person [name=张学友, age=19, sex=男]
Person [name=刘德华, age=18, sex=男]
Person [name=林忆莲, age=25, sex=女]
Person [name=谭咏麟, age=20, sex=男]
Person [name=孙燕姿, age=26, sex=女]
后序访问______________________________
Person [name=郑秀文, age=24, sex=女]
Person [name=梅艳芳, age=23, sex=女]
Person [name=陈百强, age=22, sex=男]
Person [name=张国荣, age=21, sex=男]
Person [name=张学友, age=19, sex=男]
Person [name=林忆莲, age=25, sex=女]
Person [name=孙燕姿, age=26, sex=女]
Person [name=谭咏麟, age=20, sex=男]
Person [name=刘德华, age=18, sex=男]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值