新手学习算法----二叉树()
题目:给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。
思路:用递归实现,root满足条件时候,将root加入result中,再递归左右子树,若root<k1时,则表示只有在root的右子树才存在满足条件的节点,同理root>k2,只有root的左子树才存在
java代码:
public class Solution { private ArrayList<Integer> result = new ArrayList<Integer>(); public ArrayList<Integer> searchRange(TreeNode root, int k1, int k2) { if(root == null){ return result; } if(root.val<k1){ searchRange(root.right, k1, k2); } if(k1<=root.val&&root.val<=k2){ result.add(root.val); searchRange(root.left,k1,k2); searchRange(root.right,k1,k2); } if(root.val>k2){ searchRange(root.left,k1,k2); } Collections.sort(result); //在前面的add添加进去的不是按顺序添加进去的,因为每一次都是在第三个if里面判断root.val是否在k1 k2范围,但不是按顺序来的,所以需要用sort来重新按从小到大排列 return result; } }
九章算法:
Java代码:
public class Solution{ private ArrayList<Integer> result = new ArrayList<Integer>(); public ArrayList<Integer> searchRange(TreeNode root, int k1, int k2) { // write your code here //首先我的思路是:分别找到k1 k2第一个小于和第一个大于的点然后按着其每一个节点的后序后续节点add到数组result里面 //ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } helper(root, k1, k2); return result; } private void helper(TreeNode root, int k1, int k2){ if(root == null){ return ; } if(root.val>k1){ //这里需要区分和一般的判断某一个数是否在给定的区间里面,在这里如果root值大于k1说明k1在root的左边,需要继续往左找一直找到第一个root.val小于k1的那个点 helper(root.left,k1,k2); } if(root.val>=k1&&root.val<=k2){ result.add(root.val); } if(root.val<k2){ helper(root.right,k1,k2); } }