Path Sum II

思路:回溯  

public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(root == null) return list;
List<Integer> inList = new ArrayList<Integer>();
getPath(root,sum,list,inList);
return list;
} public void getPath(TreeNode root,int sum,List<List<Integer>> list,List<Integer> inList){
if(root == null) return;
inList.add(root.val);
if(root.left == null && root.right == null && root.val == sum){
list.add(new ArrayList<Integer>(inList));
} getPath(root.left,sum - root.val,list,inList);
getPath(root.right,sum - root.val,list,inList);
inList.remove(inList.size() - 1);
return;
}

Path Sum III

思路:从头结点开始计算以头结点开始的路径条数,然后递归计算左节点和右节点  

public int pathSum(TreeNode root, int sum) {
if(root == null) return 0;
return dfs(root,sum) + pathSum(root.left,sum) + pathSum(root.right,sum);
} public int dfs(TreeNode root,int sum){
int cnt = 0;
if(root == null) return 0;
if(root.val == sum) cnt++;
return cnt + dfs(root.left,sum - root.val) + dfs(root.right,sum - root.val);
}

Delete Node in a BST

思路:判断key和头结点的val,利用二叉查找树的特点,递归查找直到它们相等;然后分为三种情况:
1.若左右子树都不为空,则找到右子树中的最小值赋给root,然后像右删除该节点
2.若左子树为空,则root = root.right
3.若右子树为空,则root = root.left public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
if(root.val > key){
root.left = deleteNode(root.left,key);
}
else if(root.val < key){
root.right = deleteNode(root.right,key);
}
else{
if(root.left != null && root.right != null){
TreeNode node = getMin(root);
root.val = node.val;
root.right = deleteNode(root.right,root.val);
}
else if(root.left == null) root = root.right;
else root = root.left;
}
return root;
} public TreeNode getMin(TreeNode root){
TreeNode ptr = root.right;
while(ptr.left != null){
ptr = ptr.left;
}
return ptr;
}

Sum Root to Leaf Numbers

思路:依次往下计算总和,注意如果遇到不好计算的变量,考虑将其作为参数传入  

public int sumNumbers(TreeNode root) {
if(root == null) return 0;
int total = getSum(root,0,0);
return total;
} public int getSum(TreeNode root,int sum,int total){
if(root == null) return 0;
sum = sum * 10 + root.val;
if(root.left == null && root.right == null){
total += sum;
}
return total + getSum(root.left,sum,total) + getSum(root.right,sum,total);
}

117. Populating Next Right Pointers in Each Node II constant space另解

TreeLinkNode dummyHead = new TreeLinkNode(0);
TreeLinkNode pre = dummyHead;
while (root != null) {
if (root.left != null) {
pre.next = root.left;
pre = pre.next;
}
if (root.right != null) {
pre.next = root.right;
pre = pre.next;
}
root = root.next;
if (root == null) {
pre = dummyHead;
root = dummyHead.next;
dummyHead.next = null;
}
}
总结
102/107/103/199/116/117	利用队列,层次遍历
**404 递归判断,只要是左叶子节点,则将val加起来
**257 递归判断,若是叶子节点则只需连接val,入list返回即可,若不是则需连接val加->
100 递归判断头结点是否一致或是否都为空
235 判断两节点与头结点的大小,利用二叉查找树的特点
110 需要计算左子树和右子树的高度判断是否是平衡二叉树,递归
112 只要叶子节点等于target则返回true,递归
226 先翻转头结点的左右子树,然后递归将左右子树分别最为头结点翻转
104 计算树的最大高度
111 计算树的最小高度,注意当左子树为空时,高度应为1+右子树高度,而不是1,右子树为空亦然
101 是226和100的综合,将左子树完全翻转以后看和右子树是不是一致
230/98 中序遍历
108 每次找中间的数作为头结点,递归
94/144/145 树的三种遍历
训练
**Serialize and Deserialize BST :保存前向遍历结果,利用二叉查找树的特点,小于头结点的放一边,大于头结点的放一边,遍历
House Robber III :计算每个节点的最大rob值并保存在map中避免重复计算
**Lowest Common Ancestor of a Binary Tree :分别找到两个节点的路径,然后依次比较
Count Complete Tree Nodes :计算左高度和右高度是否一致,不一致则递归计算
**Binary Search Tree Iterator:利用栈首先将左子树都入栈,接着查找next smallest
**Flatten Binary Tree to Linked List:注意左右子树都要赋值
Unique Binary Search Trees:左子树和右子树的种类相乘为一个顶点的所有情况
**Recover Binary Search Tree:中序遍历,找到那两个节点,然后交换
Serialize and Deserialize Binary Tree:前序遍历将null也序列化进去,然后利用队列建树(q.addAll(Arrays.asList(data.split(",")));)
提示
若递归以后的结果直接是最后的结果则直接在主函数内进行,如计数
若需要将递归以后的结果放入list,则需将list作为参数传递给另一函数,在此函数中进行递归 常用:
计算树的高度
四种遍历方式(前序、中序、后序、层次)
在二分查找树的题中,想到中序遍历
java队列的使用
add        增加一个元索                如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
remove、element、offer 、poll、peek 其实是属于Queue接口。
java栈的使用
add/push	添加一个元素
pop 弹出一个元素
peek 查看首个元素,不移除

LeetCode----Tree的更多相关文章

  1. 814. Binary Tree Pruning(leetcode) (tree traverse)

    https://leetcode.com/contest/weekly-contest-79/problems/binary-tree-pruning/ -- 814 from leetcode tr ...

  2. leetcode tree相关题目总结

    leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...

  3. LeetCode & tree & binary tree

    LeetCode & tree & binary tree 树 & 二叉树 refs https://leetcode.com/problemset/all/?topicSlu ...

  4. [leetcode tree]107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  5. [leetcode tree]103. Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. [leetcode tree]102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  7. [leetcode tree]101. Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  8. [leetcode tree]98. Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  9. [leetcode tree]95. Unique Binary Search Trees II

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  10. [leetcode tree]104. Maximum Depth of Binary Tree

    求树的最大深度 class Solution(object): def maxDepth(self, root): if not root: return 0 left = self.maxDepth ...

随机推荐

  1. 第三篇——软件之殇,WE ARE THOUSANDS APART!

    软件工程是一门工程性的学科,其目标主要是成功地建造一个大型软件系统.这其中包括:付出较低的开发成本:达到要求的软件功能:取得较好的软件性能:开发的软件易于移植:需要较低的维护费用:能按时完成开发任务, ...

  2. Duilib开发环境搭建

    1.到github上下载最新版本,https://github.com/duilib/duilib,也没有发现版本号,就如图所示吧 2.我只安装了VS2008,而github上的已经更新到VS2013 ...

  3. C语言状态机

    转载声明 如果转载本博客内容,请联系869119842@qq.com,获得作者书面授权 前言 状态机的好处不用多说,自己百度去,但传统的编程模式,无论是C语言,或是硬件FPGA的Verilog都是采用 ...

  4. DotNetBar中collapsibleSplitContainer的问题

    如果有两个collapsibleSplitContainer,并且将splitwidth都设置为1,则只有第一个起作用,如,窗体设计中的图是: 而执行的图是: 解决办法:在窗体load里手动将第二个c ...

  5. api将一统江湖,再无app

    api的出现,使人们可以通过各种软硬件设备获取所需服务,而不需要安装臃肿的app:今后的智能设备将不再依赖软件.操作系统和硬件,或许一台51单片机都可以提供给用户所需信息.当然连名字都可以简单到不叫a ...

  6. C语言内存分区

    在C/C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.     栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变 ...

  7. win32记事本程序(一)

    我不会取标题,大体上我想用win32,模仿windows的记事本,写个记事本程序,最后让我的程序和微软的程序在外观和功能上都差不多.这样一来我可以学到一些新知识,巩固旧的知识. 一.首先做个菜单栏吧. ...

  8. MyBaits使用小结

      Mybatis用like进行模糊查询的时候,配置与所用的数据库有关系,总结了下,具体如下: 1.MySQL :LIKE CONCAT('%',#{empname},'%' ) 或者 LIKE CO ...

  9. 数据分析:中国高校更名历史 Python

    上周领了新任务,做国内高校改名历史的统计,这个挺有意思,以下是我任务完成过程,和大家分享. 一. 数据收集 数据需求:目前已有高校校名,各高校改名历史记录 高校校名数据来源:尝试从高校排名网站(iPI ...

  10. CKEditor使用配置方法

    一.使用方法: 1.在页面<head>中引入ckeditor核心文件ckeditor.js <script type="text/javascript" src= ...