找出一棵树某一深度所有节点

方法一:

  • 思路:  

运用左右子树依次递归,根据深度值 k 每次递归k值减去 1 。直到 k 值为1时把此节点加入到结果队列,最后返回结果输出。

  • 伪代码:

main(){

    创建一棵测试树;

    创建一个结果队列 (接收返回值) = outPutNode(根节点,深度值);

    打印结果;

}

outPutNode(根节点,深度值){

    如果根节点为空或者深度值小于等于0 返回空

    创建结果队列resultQueue;

    方法Get递归操作(根节点,深度值,结果队列);

}

Get(根节点,深度值,结果队列){

    如果根节点为空或者深度值k小于等于0 return;

    如果深度值k等于1 则把此节点加入到结果队列;再return;

    如果根节点的左子树不为空 { Get(根节点的左子树,k-1 ,结果队列)}

    如果根节点的右子树不为空 { Get(根节点的右子树,k-1 ,结果队列)}

}

  • 源码

  •     public static void main(String[] args) {
    		TreeNode root = new TreeNode(4);
    		TreeNode l = new TreeNode(2);
    		TreeNode r = new TreeNode(6);
    		TreeNode ll = new TreeNode(1);
    		TreeNode lr = new TreeNode(3);
    		TreeNode rl = new TreeNode(5);
    		TreeNode rr = new TreeNode(7);
    		
    		l.left = ll;
    		l.right = lr;
    		
    		r.left = rl;
    		r.right = rr;
    		
    		root.left = l;
    		root.right = r;
    		//测试 获取第二层所有节点
    		Queue<TreeNode> resultQueue = outPutNode(root, 2);
    		while(!resultQueue.isEmpty()) {
    			System.out.println(resultQueue.poll().val);
    		}
    	}
    
        public static Queue<TreeNode> outPutNode(TreeNode root,int k) {
    		if(root==null || k <= 0 ) return null;
    		Queue<TreeNode> queue = new LinkedList<TreeNode>();
    		Get(root,k,queue);
    		return queue;
    	}
    	private static void Get(TreeNode root, int k, Queue<TreeNode> queue) {
    		if(root==null || k <= 0 ) return ;
    		if(k==1) {
    			queue.add(root);
    			return;
    		}
    		if(root.left!=null)
    			Get(root.left, k-1, queue);
    		if(root.right!=null)
    			Get(root.right, k-1, queue);
    	}

 

方法二:

  • 思路:

    运用循环,记录当前树的深度、下层节点个数、本层还需要遍历的结点个数。

  • 伪代码:

    主方法同上

    

outPutNode(根节点,深度值){

    如果根节点为空 返回空

    创建结果队列;

    创建临时节点tempTreeNode

    将根节点添加至结果队列;

    初始化 当前深度值height = 1 ;下一层节点个数nextNum = 0;本层还需要遍历的结点个数 curNum = 1;

    while(当队列不为空){

        如果当前深度值height等于目标深度k 则break;

        tempTreeNode = 节点出队列;

        如果tempTreeNode的左子树不为空{

             将tempTreeNode的左子树添加至队列;

             下一层节点个数nextNum+1;

        }

        如果tempTreeNode的右子树不为空{

             将tempTreeNode的右子树添加至队列;

             下一层节点个数nextNum+1;

        }

        本层的一个节点操作完毕,将本层节点数curNum - 1;

        如果本层节点值等于0{

              本层节点数curNum = 下层节点数nextNum;

               下层节点数nextNum = 0;

               深度值height + 1;

        }

    }

    返回队列   //队列内全是目标层节点;

}

  • 源码

public static void main(String[] args) {
		TreeNode root = new TreeNode(4);
		TreeNode l = new TreeNode(2);
		TreeNode r = new TreeNode(6);
		TreeNode ll = new TreeNode(1);
		TreeNode lr = new TreeNode(3);
		TreeNode rl = new TreeNode(5);
		TreeNode rr = new TreeNode(7);
		
		l.left = ll;
		l.right = lr;
		
		r.left = rl;
		r.right = rr;
		
		root.left = l;
		root.right = r;
		//测试 获取第二层所有节点
		Queue<TreeNode> queue = outPutNode(root, 2);
		while(!queue.isEmpty()) {
			System.out.println(queue.poll().val);
		}
	}



	public static Queue<TreeNode> outPutNode(TreeNode root,int k) {
		if(root==null)return null;
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		queue.add(root);
		TreeNode tempTreeNode;
		int height = 1;//当前高度
		int nextNum = 0; //下一层节点个数
		int curNum = 1;//本层还需要遍历的结点个数
		while(!queue.isEmpty()) {
			if(height== k) {//判断是否是当前高度
				break;
			}
			tempTreeNode = queue.poll();
			if(tempTreeNode.left!=null) {
				queue.add(tempTreeNode.left);
				nextNum++;
			}
			if(tempTreeNode.right!=null) {
				queue.add(tempTreeNode.right);
				nextNum++;
			}
			curNum--;
			if(curNum==0) {//表示本层已遍历完毕,跳到下一层
				curNum = nextNum;//下一层节点值 赋给本层节点
				nextNum= 0 ;//下层节点初始化为0
				height++;//深度值+1
			}
		}
		return queue;//队列内全是目的层节点
	}
  • 输入

      深度值为 2

                4

             /      \

          2          6

      /     \      /      \

    1       3    5       7

  •  输出

  2  6

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 一个常见的算法是使用深度优先搜索(DFS)来遍历整棵树,同时维护一个变量来记录当前的深度。当遍历到叶子节点时,记录下当前深度,然后在回溯的过程中更新最短距离即可。另外,还可以使用广度优先搜索(BFS)来实现。 ### 回答2: 最短叶子节点距离的算法可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来实现。 采用深度优先搜索算法的步骤如下: 1. 首先创建一个辅助函数DFS来遍历每个节点,并传入当前节点、当前节点深度和当前的最小距离。 2. 在DFS函数中,首先检查当前节点是否为叶子节点,如果是,则更新最小距离为当前深度与最小距离中的较小值。 3. 然后分别对当前节点的左子节点和右子节点递归调用DFS函数。 4. 在返回到上一层之前,将当前节点深度减1,以确保在遍历下一个子节点时,深度正确地计算。 5. 在主函数中,首先设置最小距离为正无穷大。 6. 调用DFS函数,传入根节点、初始深度为0和初始最小距离。 7. 返回最小距离作为最短叶子节点距离。 当然,也可以选择使用广度优先搜索算法来解决。广度优先搜索的步骤如下: 1. 首先创建一个队列,并将根节点入队。 2. 创建一个变量来保存当前层的节点数量和一个变量来保存最小距离,并初始化为正无穷大。 3. 进行循环,直到队列为空。 4. 在循环中,首先将当前层的节点数量设置为队列的大小。 5. 然后从队列中依次队当前层的节点。如果该节点是叶子节点,则更新最小距离为当前节点的层数与最小距离的较小值。 6. 将当前节点的子节点依次入队。 7. 在循环结束后,返回最小距离作为最短叶子节点距离。 以上就是两种解决方法的简要步骤,根据具体情况,选择其中一种算法来实现即可。 ### 回答3: 要最短叶子节点距离的算法,我们可以使用深度优先搜索(DFS)来遍历树的每个节点,并通过更新最小距离来到最短叶子节点距离。 具体算法步骤如下: 1. 从根节点开始,进行深度优先搜索。 2. 当访问到叶子节点时,计算当前叶子节点深度。 3. 将当前叶子节点深度与已记录的最小距离进行比较,更新最小距离。 4. 继续搜索其他叶子节点。 5. 当搜索完所有叶子节点后,算法结束,返回最小距离。 通过深度优先搜索的方式,我们可以保证遍历到每个叶子节点,并计算每个叶子节点深度。通过不断更新最小距离,最后得到的最小距离就是所求的最短叶子节点距离。 需要注意的是,在实现中,我们可以采用递归的方式实现深度优先搜索,同时需要定义一个全局变量来记录最小距离,并在每次更新时进行更新。最后,我们返回记录的最小距离即可。 这个算法的时间复杂度为O(n),其中n为树的节点数。因为我们需要遍历树的每个节点,而每个节点只会被访问一次,所以时间复杂度为线性的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值