LeetCode Summary Tree

来源:互联网 发布:js判断质数 编辑:程序博客网 时间:2024/06/06 08:53
============================= Tree ===============================


先中后->树
105. Construct Binary Tree from Preorder and Inorder Traversal(先序+中序->树)
先序遍历第一个是根,中序遍历用这个根分成左右子树
106. Construct Binary Tree from Inorder and Postorder Traversal(中序+后序->树)
后序->根,中序用跟->左和右

中序遍历
94. Binary Tree Inorder Traversal
先序遍历
144 Binary Tree Preorder Traversal
后序遍历
145 Binary Tree Postorder Traversal
331. Verify Preorder Serialization of a Binary Tree(验证后序遍历树)



基本概念
常用递归调用函数分别处理左和右儿子。
235. Lowest Common Ancestor of a Binary Search Tree(连个节点最近的祖先)
Mine: 暴力枚举,很慢
Discuss:是二叉搜索树,所以可以用比大小的关系来方便找祖先
如果root比min(n1,n2),小,往右找
如果root比min(n1,n2),大,往左找
if (p -> val < root -> val && q -> val < root -> val) return lowestCommonAncestor(root -> left, p, q);
if (p -> val > root -> val && q -> val > root -> val) return lowestCommonAncestor(root -> right, p, q);
return root;
236. Lowest Common Ancestor of a Binary Tree(普通树的最近祖先)
Mine: 用两个stack记录节点的路径,然后出栈比对,找祖先
Discuss:非常简洁的递归
if (!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
return !left ? right : !right ? left : root;
110. Balanced Binary Tree(判断树是否平衡)
Mine:bool flag = abs(maxDepth(root->left)-maxDepth(root->right))<=1;
         return (flag && isBalanced(root->left) && isBalanced(root->right));
222. Count Complete Tree Nodes(计算完全二叉树的结点个数)
模拟
104. Maximum Depth of Binary Tree(求最大深度)
Mine: 模拟
Discuss: 递归,非常简洁
       if (root == NULL) return 0;
return max(maxDepth(root->left),maxDepth(root->right))+1;   
111. Minimum Depth of Binary Tree(求二叉树的最小深度)
S(Mine):BFS,用queue逐层放进去结点,直至结点为叶子,返回深度。
S(Discuss): 递归调用,分情况处理,1.若一个儿子空 2.两儿子都不空
int left = minDepth(root.left);int right = minDepth(root.right);
        return (left == 0 || right == 0) ? left + right + 1: Math.min(left,right) + 1;
112. Path Sum(查找从根到叶子是否存在和为给定的sum)
S(Mine): 模拟
S(Discuss): 递归分别处理left和right,传递参数是sum-root->val
if (root == NULL) return false; if (root->val == sum && root->left ==  NULL && root->right == NULL) return true;
        return hasPathSum(root->left, sum-root->val) || hasPathSum(root->right, sum-root->val);
226. Invert Binary Tree(镜面翻转一棵树)
Mine: 递归
100. Same Tree(判断两棵树是否相同)
101. Symmetric Tree(判断一棵树是否轴对称)
Mine: 复制一棵树->反转->比对是否相同
Discuss:直接用递归进行比对。
(1) 判断传递进来的两个点的值是否相同
(2) 递归时,儿子的儿子的对应关系,我点我完全没想到,这个好机智!
(left->left,right->right)
(left->right,right->left)
递归时,这么一种对应判断的关系
按层放置在vector里面
102. Binary Tree Level Order Traversal(把二叉树按照层次放在二位vector里面)
Mine: 使用队列即可
103. Binary Tree Zigzag Level Order Traversal(按层,一层正序,一层逆序)
Mine: 同上,flag标记正序逆序即可
107. Binary Tree Level Order Traversal II(叶子->根按层)
Mine: 同上


114. Flatten Binary Tree to Linked List(二叉树伸展成链表)
Discuss: We simply flatten left and right subtree and paste each sublist to the right child of the root. 

----------------------------------- Segment Tree -----------------------------------
307. Range Sum Query - Mutable(不断更新某点的值,以及求区间的和)
Mine: 经典线段树用法,改了好多次才通过。
Discuss: 使用了二叉索引树,见本文档后面。

---------------------------------- Binary Indexed Tree -----------------------------
原来这个翻译成树状数组
307. Range Sum Query - Mutable(不断更新某点的值,以及求区间的和)
Discuss: 
----------------------------------- Trie -------------------------------------------
336. Palindrome Pairs(给定一个字典,找到所有的组合对,使得他们连在一起是回文串)
可用作Trie模板
Hard: 这个程序好长好长,看起来挺复杂,我也忘了当时自己咋写的了。。当时的我好屌比啊。。
208. Implement Trie (Prefix Tree)(完成Trie基本操作,插入,删除,查找)
Mine: 结点定义:是否单词;a-z个儿子。本code可作为模板
class TrieNode {
public:
TrieNode* child[27];
bool word;
TrieNode() {
word=false;
for(int i=1;i<=26;i++)
child[i]=NULL;
}
};
211. Add and Search Word - Data structure design(查找单词,.代表所有字母)
Mine: 依次遍历要查找的单词的每一位字母
1. 特定字母直接搜索
2. . 遍历a-z,看哪个存在。
3. 维护2个队列,一个放前一个点的所有情况;一个放生成的新的点的所有情况。



-------------------------------- Binary Search Tree --------------------------------
验证:递归函数加上当前点应该在的范围low,high(数或者指针都行)
上一个访问的点:全局指针previous(初值INT_MAX/INT_MIN), 判断完当前点root的各种后,previous = root
108. Convert Sorted Array to Binary Search Tree(有序数组->BST)
Discuss:使用了递归,用到了vector引用&传参,之前没用过,还不错。
Discuss的这个code,真是完美,详见cpp
每次生成middle节点,然后去处理左和右
TreeNode* root = new TreeNode(num[middle]);
vector<int> leftInts(num.begin(), num.begin()+middle);vector<int> rightInts(num.begin()+middle+1, num.end());
root->left = sortedArrayToBST(leftInts);root->right = sortedArrayToBST(rightInts);
230. Kth Smallest Element in a BST(BST第k小的数)
遍历计数
109. Convert Sorted List to Binary Search Tree(排好序的链表转成二叉搜索树)
108. Convert Sorted Array to Binary Search Tree(排序,数组,二叉搜索树)
递归,左,右
352. Data Stream as Disjoint Intervals(非负整数流,在流的过程中,多次访问连续的所有区间)
S1(Mine): 非常慢,用set存储当前出现过的所有数,每次查询区间时,set转vector,依次遍历求连续区间。
S2(Discuss):使用二叉搜索树
98. Validate Binary Search Tree(判断是否合法BST)
Discuss: 先序遍历,记录当前点应该出的low和high的范围的结点指针,判断是否在这个范围,不在false
bool preOrderCheck(TreeNode* root,TreeNode* low, TreeNode* high)
在就继续递归:左儿子,(low,root);右儿子,(root,high)
99. Recover Binary Search Tree(两个结点位置错了,找到并更正)
Mine: 先序遍历保存在数组里(数和指针地址),遍历数组,记录下位置错的first和second,交换first和second
正循环找大的(first),反循环找小的(second)
Discuss: 使用全局prev,prev判断完和当前节点root的关系后,就prev=root
这点就是我也想这么做时候没想到的!
if(root==NULL) return ;
help(root->left);
if (first==NULL && previous->val >= root->val) first = previous;
if (first!=NULL && previous->val >= root->val) second = root;
previous = root;
help(root->right);
0 0
原创粉丝点击