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=男]