今天总结一下以前学过的树,直接讲二叉树吧,就是说节点最多会有两个孩子。
以前一直没有去实现过,只是泛泛而谈,导致其实我自己对建树这一块很模糊。今天总结了三种建树的方法:
1.就直接new很多个TreeNode节点,然后自己手动去指哪一个左孩子和右孩子
2.采用递归的方式去建树,就是定好根节点后,再建左子树(这儿递归,从左子树的根节点递归下去),再建右子树。递归终止条件我想就是遇到null了吧
3.按照根节点、左子节点和右子节点的关系可以也可以建树,不信你看:
//建棵树
public void createTree(Object[] objs){
datas = new ArrayList<TreeNode>();
for(Object obj:objs){
datas.add(new TreeNode(obj));
}
root = datas.get(0); //将第一个数作为根节点
for(int i=0;i<objs.length/2;i++){
datas.get(i).left = datas.get(i*2+1);
if(i*2+2<datas.size()){
datas.get(i).right = datas.get(i*2+2);
}
}
}
直接附整个代码吧。
import java.util.ArrayList;
import java.util.List;
public class BasicOp {
static TreeNode root = null;
static List<TreeNode> datas = null;
public static void main(String[] args) {
BasicOp bo = new BasicOp();
Object[] arr = {1,2,3,4,5,6,7,8};
bo.createTree(arr);
bo.preOrder(root);
System.out.println();
bo.inOrder(root);
System.out.println();
bo.afterOrder(root);
}
//建棵树
public void createTree(Object[] objs){
datas = new ArrayList<TreeNode>();
for(Object obj:objs){
datas.add(new TreeNode(obj));
}
root = datas.get(0); //将第一个数作为根节点
for(int i=0;i<objs.length/2;i++){
datas.get(i).left = datas.get(i*2+1);
if(i*2+2<datas.size()){
datas.get(i).right = datas.get(i*2+2);
}
}
}
public void print(Object obj){
System.out.print(obj+" ");
}
//前序遍历递归方式
public void preOrder(TreeNode root){
if(root!=null){
print(root.data);
preOrder(root.left);
preOrder(root.right);
}
}
//中序遍历递归方式
public void inOrder(TreeNode root){
if(root!=null){
inOrder(root.left);
print(root.data);
inOrder(root.right);
}
}
//后序遍历方式
public void afterOrder(TreeNode root){
if(root!=null){
afterOrder(root.left);
afterOrder(root.right);
print(root.data);
}
}
}
class TreeNode{
Object data;
TreeNode left;
TreeNode right;
public TreeNode(Object obj){
this.data = obj;
}
}
运行结果:
这只是递归的遍历,还有非递归形式的遍历,采用了栈这种数据结构去处理。链接:https://www.cnblogs.com/LYKblogdream/p/7943245.html
最后,附上层次遍历的实现:
//层次遍历
public void layerOrder(){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode curr = queue.poll();
System.out.print(curr.data+" ");
if(curr.left!=null){
queue.offer(curr.left);
}
if(curr.right!=null){
queue.offer(curr.right);
}
}
}