Java Tree

节点的结构

public class TreeNode {

	int val;
	TreeNode left;
	TreeNode right;
	
	public TreeNode(int x){
		val = x;
	}
	public TreeNode(){
		
	}
}

给定数据集,构造BST

public TreeNode BSTinsert(TreeNode root, int element){
		
		if(null == root){
			root = new TreeNode(element);
			root.left = null;
			root.right = null;
			count++;
			return root;
		}
		if(element == root.val)
			return null;
		if(element < root.val)
			root.left = BSTinsert(root.left, element);
		else
			root.right = BSTinsert(root.right, element);
		return root;
				
	}
	
	public boolean createBST(int[] data){
		
		for(int element: data){
			if((root=BSTinsert(root,element)) ==null)
				return false;
		//	System.out.println("insert: "+ element);
		}
		return true;
	}

中间结构

class MyQueue<T>{
	private LinkedList<T> queue; 
	public  MyQueue(){
		queue = new LinkedList<T>();
	}
	public void add(T t){
		queue.addFirst(t);
	}
	public T poll(){
		return queue.removeLast();
	}
	public boolean isEmpty(){
		return queue.isEmpty();
	}
}

class MyStack<T>{
	private LinkedList<T> data;
	public MyStack(){
		data = new LinkedList<T>();
	}
	public T pop(){
		return data.removeFirst();
	}
	public void push(T t){
		 data.addFirst(t);
	}
	public T getTop(){
		return data.getFirst();
	}
	public boolean isEmpty(){
		return data.isEmpty();
	}
}

递归遍历BST

<pre name="code" class="java">	public void inOrderTraverse(TreeNode root){
		if(null !=root){
			inOrderTraverse(root.left);
			System.out.println(root.val);
			inOrderTraverse(root.right);
		}
	}


 
 

非递归遍历BST

	public void inOrderTraverseWithoutRec(BST bst){
		
		MyStack<TreeNode> TreeNodes =  new MyStack<TreeNode>();
		TreeNode root = bst.root;
		TreeNode currantNode = root;
		while(currantNode!=null || !TreeNodes.isEmpty()){
			while(currantNode!=null){
				TreeNodes.push(currantNode);
				currantNode = currantNode.left;
			}
			
			if(TreeNodes.isEmpty())
				return;
			else{
				currantNode = TreeNodes.pop();
				System.out.println(currantNode.val);
				currantNode = currantNode.right;
			}
		}
	}

	public void PreOrderTraverseWithoutRec(BST bst){
			
		MyStack<TreeNode> TreeNodes =  new MyStack<TreeNode>();
		TreeNode root = bst.root;
		TreeNode currantNode = root;
		while(currantNode!=null || !TreeNodes.isEmpty()){
			while(currantNode!=null){
				System.out.println(currantNode.val);
				TreeNodes.push(currantNode);
				currantNode = currantNode.left;
			}
			
			if(!TreeNodes.isEmpty()){
				currantNode = TreeNodes.pop();
				currantNode = currantNode.right;
			}
		}
	}
	
	public void postOrderTraverWithoutRec(BST bst){
		
		MyStack<TreeNode> TreeNodes =  new MyStack<TreeNode>();
		TreeNode root = bst.root;
		TreeNode currantNode = root;
		while(currantNode!=null){
			
			for(;currantNode.left!=null;currantNode = currantNode.left)
				TreeNodes.push(currantNode);
			
			while(currantNode!=null &&(currantNode.right==null || currantNode.right==root)){
				System.out.println(currantNode.val);
				root = currantNode;
				if(TreeNodes.isEmpty())
					return;
				currantNode = TreeNodes.pop();
			}
			TreeNodes.push(currantNode);
			currantNode = currantNode.right;
		}
	}
	
	public void LevelOrder(BST bst){
		
		MyQueue<TreeNode> BSTreeNode = new MyQueue<TreeNode>();
		if(bst.root ==null)
			return;
		BSTreeNode.add(bst.root);
		while(!BSTreeNode.isEmpty()){
			TreeNode currantNode = BSTreeNode.poll();
			System.out.println(currantNode.val);
			if(currantNode.left!=null)
				BSTreeNode.add(currantNode.left);
			if(currantNode.right!=null)
				BSTreeNode.add(currantNode.right);
		}
	}
	


BST中第K个最小的数

	
	public int kthSmallest(TreeNode root, int k) {
		if(size(root.left) == k-1)
			return root.val;
		
		else if(size(root.left) < k-1)
			return kthSmallest(root.right, k-(size(root.left)+1));
		
		else
			return kthSmallest(root.left, k);	
    }
	
	public int size(TreeNode root){
		if(root == null)
			return 0;
		if(null == root.left && null == root.right)
			return 1;
		else
			return size(root.left)+size(root.right)+1;
	}
	


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用递归算法来过滤并展示树形结构。 首先,我们可以定义一个树的节点类,该类包含一个数据属性和一个子节点列表。例如: ``` class TreeNode { private int data; private List<TreeNode> children; // 构造函数和其他方法省略 } ``` 接下来,我们可以使用递归算法来过滤和展示树结构。假设我们希望过滤出所有满足特定条件的节点,然后展示出这些节点及其子节点。 首先,我们需要编写一个递归方法,该方法接受一个根节点和一个过滤条件。在该方法内部,我们对当前节点进行过滤判断,如果满足条件,则将该节点加入结果列表中。然后,我们再递归调用该方法,对当前节点的每个子节点进行相同的过滤操作。 具体的代码实现如下: ```java public List<TreeNode> filterAndDisplay(TreeNode root, Predicate<TreeNode> filter) { List<TreeNode> result = new ArrayList<>(); if (filter.test(root)) { result.add(root); } for (TreeNode child : root.getChildren()) { result.addAll(filterAndDisplay(child, filter)); } return result; } ``` 使用该方法,我们可以通过传入不同的过滤条件来过滤展示树的节点。例如,假设我们的树结构如下: ``` 1 / \ 2 3 / \ 4 5 ``` 如果我们希望过滤出所有大于2的节点,可以这样调用方法: ```java List<TreeNode> filteredNodes = filterAndDisplay(root, node -> node.getData() > 2); ``` 这样,`filteredNodes`列表将包含节点值为3、4和5的节点。 以上就是使用Java对树结构进行过滤和展示的基本方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值