java Tree

最近做了好多在线笔试,发现关于树的问题还是很多的,在这里做一个统一整理

都是最基本的:

树的定义‘

public class Tree {
	Tree left;
	Tree right;
	int val;
	public Tree(int val){
		this.val=val;
	}
}
建树

一种数组,一种前序中序建树 

public class BuildTree {
	public Tree createTree(Tree root,int[]nums,int i){
		int len=nums.length;
		root=new Tree(nums[i]);
		if(2*i+1<len)root.left=createTree(root.left,nums,2*i+1);
		if(2*i+2<len)root.right=createTree(root.right,nums,2*i+2);
		return root;	
	}
	public Tree createTree(Tree root,int[]pre,int[]mid){
		root=new Tree(pre[0]);
		int index=getIndex(pre[0],mid);
		int[]prel=Arrays.copyOfRange(pre, 1,index+1);
		int[]midl=Arrays.copyOfRange(mid, 0,index);
		int[]prer=Arrays.copyOfRange(pre, index+1,pre.length);
		int[]midr=Arrays.copyOfRange(mid, index+1,mid.length);
		if(prel.length!=0) root.left=createTree(root.left,prel,midl);
		if(prer.length!=0) root.right=createTree(root.right,prer,midr);
		return root;
		
	}
	public int getIndex(int n,int[]num){
		for(int i=0;i<num.length;i++){
			if(n==num[i]) return i;
		}
		return -1;
	}
}

树的遍历: 5种遍历 外加路径

import java.util.ArrayList;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingQueue;

public class SearchTree {
	public void preSearch(Tree root){
		if(root==null) return;
		System.out.println(root.val);
		preSearch(root.left);
		preSearch(root.right);
	}
	public void midSearch(Tree root){
		if(root==null) return;
		preSearch(root.left);
		System.out.println(root.val);
		preSearch(root.right);
	}
	public void proSearch(Tree root){
		if(root==null) return;
		preSearch(root.left);
		preSearch(root.right);
		System.out.println(root.val);
	}
	public void pSearch(Tree root){
		if(root==null) return;
		Queue<Tree> res=new LinkedBlockingQueue<Tree>();
		res.add(root);
		while(!res.isEmpty()){
			Tree temp=res.poll();
			System.out.println(temp.val);
			if(temp.left!=null)res.add(temp.left);
			if(temp.right!=null) res.add(temp.right);
		}
	}
	public void dSearch(Tree root){
		if(root==null) return;
		Stack<Tree> res=new Stack<Tree>();
		res.add(root);
		while(!res.isEmpty()){
			Tree temp=res.pop();
			System.out.println(temp.val);
			if(temp.right!=null) res.add(temp.right);
			if(temp.left!=null)res.add(temp.left);
			
		}
	}
    public ArrayList<ArrayList<Integer>> FindPath(Tree root,ArrayList<ArrayList<Integer>>res,ArrayList<Integer> mres) {
        if(root==null) return res;
        mres.add(root.val);;
        if(root.left==null&&root.right==null) res.add(new ArrayList<Integer>(mres));
        FindPath(root.left,res,mres);
        FindPath(root.right,res,mres);
        mres.remove(mres.size()-1);
        return res;
        
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值