二叉树
练习:求根到叶子节点数字之和
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
class Solution { static int sum; public int sumNumbers(TreeNode root){ sum=0; sumNumbers1(0,root); return sum; } public static void sumNumbers1(int val,TreeNode root) { if(root==null) return ; int k=(val*10+root.val); if(root.left==null&&root.right==null){ sum=sum+k; } sumNumbers1(k,root.left); sumNumbers1(k,root.right); } }
妈耶,破防了
练习:二叉树的最近公共祖先
练习:从前序与中序遍历序列构造二叉树
class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder.length==0&&inorder.length==0){ return null; } TreeNode root=new TreeNode(preorder[0]); for(int i=0;i<inorder.length;i++){ if(preorder[0]==inorder[i]){ root.left=buildTree(Arrays.copyOfRange(preorder,1,i+1),Arrays.copyOfRange(inorder,0,i)); root.right=buildTree(Arrays.copyOfRange(preorder,i+1,preorder.length),Arrays.copyOfRange(inorder,i+1,inorder.length)); break; } }
练习:从中序与后序遍历序列构造二叉
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder.length==0&&postorder.length==0){
return null;
}
TreeNode root=new TreeNode(postorder[postorder.length-1]);
for(int i=0;i<inorder.length;i++){
if(inorder[i]==postorder[postorder.length-1]){
root.left=buildTree(Arrays.copyOfRange(inorder,0,i+1),Arrays.copyOfRange(postorder,postorder.length-i-1,postorder.length));
root.right=buildTree(Arrays.copyOfRange(inorder,i+2,inorder.length),Arrays.copyOfRange(postorder,0,postorder.length-1));
break;
}
}
return root;
}
}
超时了,优化开始了。
超出时间限制.....
不知道怎么优化了,,,,查了一下,好像是用栈或者hash,下次填坑。
练习:前序遍历构造二叉搜索树