Binary Tree专题
文章平均质量分 60
zhaobaoxue
这个作者很懒,什么都没留下…
展开
-
Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
转载自:http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求:1. O(1)空间复杂度,即只能使用常数空间;2. 二叉树的形状不能被破坏(中间过程允许改变其形状)。通常,实现二叉树的前序(preorder)、中序(i转载 2014-03-11 22:59:36 · 731 阅读 · 0 评论 -
Populating Next Right Pointers in Each Node II
使用迭代,时间复杂度O(n),空间复杂度O(1)。逐层处理。代码如下:class Solution {public: void connect(TreeLinkNode *root) { TreeLinkNode *cur, *start, *next; start = root; while(start) {原创 2014-03-12 18:23:58 · 478 阅读 · 0 评论 -
Unique Binary Search Trees
使用动态规划,时间O(n^2),空间O(n)。代码如下:class Solution {public: int numTrees(int n) { vector f(n+1, 0); f[0] = 1; f[1] = 1; for(int i=2; i<=n; ++i) { fo转载 2014-03-12 22:52:26 · 370 阅读 · 0 评论 -
Sum Root to Leaf Numbers
DFS遍历,遇到叶子节点则结束并回溯,并将当前值加到总值里面。时间O(n),空间O(logN)。class Solution {public: int sumNumbers(TreeNode *root) { int sum = 0; int cur = 0; dfs(root, sum, cur); return su原创 2014-03-21 10:56:45 · 356 阅读 · 0 评论 -
Path Sum
方法一,递归。时间复杂度O(n),空间O(logN)。代码如下:class Solution {public: bool hasPathSum(TreeNode *root, int sum) { if(!root) return false; if(root->left == NULL && root->right == NULL)原创 2014-03-20 22:33:34 · 479 阅读 · 0 评论 -
Path Sum II
class Solution {public: vector > pathSum(TreeNode *root, int sum) { vector > result; vector tmp; if(root == NULL) return result; pathSum(root, sum, tmp, r原创 2014-03-20 23:46:28 · 493 阅读 · 0 评论 -
Binary Tree Maximum Path Sum
递归求解,时间复杂度O(n),空间复杂度O(logN),参考Leetcode题解。注意递归返回的时候只能返回单侧路径的和或者根节点的值。class Solution {public: int max_sum; int maxPathSum(TreeNode *root) { max_sum = INT_MIN; dfs(root);转载 2014-03-21 10:19:37 · 456 阅读 · 0 评论 -
Minimum Depth of Binary Tree
分几种情况讨论:(1) 空节点。 直接返回 0;(2) 左右节点都为空(当前节点不为空), 则当前是叶子节点,返回1。(3) 左节点(或者右节点)为空, 则该节点不为叶子节点,直接返回右节点(左节点)的最小高度+1.(4) 左右都不为空,返回左右子树中的最小高度+1。代码如下:class Solution {public: int minDepth(TreeNod原创 2014-03-17 22:57:02 · 508 阅读 · 0 评论 -
Binary Tree Inorder Traversal
四种方法。方法一:使用递归。方法二:使用栈。方法三:使用栈。方法四:Morris遍历。方法一代码:class Solution {public: vector inorderTraversal(TreeNode *root) { vector result; if(root == NULL)原创 2014-03-11 16:40:26 · 398 阅读 · 0 评论 -
Binary Tree DFS遍历专题
Binary Tree DFS traversal contains preorder, inorder and postorder travelsals. In this article, we mea原创 2014-09-03 17:25:03 · 526 阅读 · 0 评论 -
Lowest Common Ancestor
1. 如果只有一次查询,参考转载 2014-10-07 19:51:52 · 471 阅读 · 0 评论 -
Balanced Binary Tree
使用辅助函数height(root),如果以root为根的树是balanced,则返回该树的高度,否则返回-1。代码如下:class Solution {public: bool isBalanced(TreeNode *root) { return height(root) >= 0; } //if the root is not a ba转载 2014-03-12 16:25:02 · 453 阅读 · 0 评论 -
Copy Binary Tree with Random Pointer
similar with the leetcode problem: copy LinkedList with random pointer原创 2014-10-12 19:35:16 · 579 阅读 · 0 评论 -
Construct Binary Tree from Preorder and Inorder Traversal
递归,时间复杂度O(n)(此处有疑问?),空间复杂度O(logN)。代码如下:class Solution {public: TreeNode *buildTree(vector &preorder, vector &inorder) { return buildTree1(preorder, inorder, 0, 0, preorder.size());原创 2014-03-12 22:14:02 · 465 阅读 · 0 评论 -
Construct Binary Tree from Inorder and Postorder Traversal
class Solution {public: TreeNode *buildTree(vector &inorder, vector &postorder) { return buildTree1(inorder, postorder, 0, 0, inorder.size()); } TreeNode *buildTree1(ve原创 2014-03-12 22:28:50 · 499 阅读 · 0 评论 -
Same Tree
方法一,递归,时间O(n),空间O(logN)。代码如下:class Solution {public: bool isSameTree(TreeNode *p, TreeNode *q) { if(!p && !q) return true; if(!p || !q) return false; retur转载 2014-03-12 12:56:14 · 318 阅读 · 0 评论 -
Symmetric Tree
方法一,使用递归,时间O(n),空间O(logN)。代码如下:class Solution {public: bool isSymmetric(TreeNode *root) { if(root == NULL) return true; else return isSymmetric(root->left, root->rig转载 2014-03-12 16:09:27 · 472 阅读 · 0 评论 -
Flatten Binary Tree to Linked List
迭代,使用前序遍历的思路。代码如下。class Solution {public: void flatten(TreeNode *root) { if(!root) return; stack s; s.push(root); TreeNode *cur, *prev = NULL;转载 2014-03-12 17:06:08 · 449 阅读 · 0 评论 -
Unique Binary Search Trees II
思路和上一题“Unique Binary Search Trees”一样,复杂度待求。代码如下:class Solution {public: vector generateTrees(int n) { return generate(1, n); } vector generate(int start, int end) {转载 2014-03-13 10:28:06 · 445 阅读 · 0 评论 -
Convert Sorted List to Binary Search Tree
参考:http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html方法一,自顶向下,与 Convert Sorted Array to Balanced Binary Search Tree (BST) 相同。由于list不能随机访问,因此找到mid元素必须遍历半个list,时间复杂度为O(nlogn)。转载 2014-03-13 12:24:43 · 752 阅读 · 0 评论 -
Convert Sorted Array to Binary Search Tree
递归法。时间O(n),空间O(logN)。class Solution {public: TreeNode *sortedArrayToBST(vector &num) { return convert(num, 0, num.size()); } TreeNode *convert(vector &num, int start, int l原创 2014-03-13 11:24:57 · 383 阅读 · 0 评论 -
Merge Sorted Array
从后往前merge。时间O(n),空间O(1)。class Solution {public: void merge(int A[], int m, int B[], int n) { int i = m-1, j=n-1, k=m+n-1; while(i>=0 && j>=0) { if(A原创 2014-03-21 11:22:51 · 410 阅读 · 0 评论 -
Binary Tree Level Order Traversal
class Solution {public: vector > levelOrder(TreeNode *root) { vector > result; if(root == NULL) return result; queue qu, next; //使用两个队列,以便区别不同的层次转载 2014-03-11 20:17:47 · 421 阅读 · 0 评论 -
Recover Binary Search Tree
使用Morris中序遍历,时间复杂度O(n),空间O(1)。class Solution {public: void recoverTree(TreeNode *root) { TreeNode *prev = NULL, *cur = root; pair broken; while(cur !=转载 2014-03-12 12:31:56 · 471 阅读 · 0 评论 -
Binary Tree Preorder Traversal
三种方法。方法一:recursion。 Time:O(n); space:O(n);方法二:使用stack。Time:O(n); space:O(n);方法三:Morris遍历。Time:O(n); space:O(1);方法一代码如下:/** * Definition for binary tree * struct TreeNode { * int v原创 2014-03-07 17:38:48 · 674 阅读 · 0 评论 -
Validate Binary Search Tree
递归法,定义辅助函数,参数为(root, lower, upper),对于每个子树,首先判断根节点满足lower和upper bound,然后根据root->val重新设定lower和upper bound,并递归调用辅助函数。代码如下:class Solution {public: bool isValidBST(TreeNode *root) { return i转载 2014-03-13 10:56:19 · 388 阅读 · 0 评论 -
Populating Next Right Pointers in Each Node
递归分层处理,代码如下:class Solution {public: void connect(TreeLinkNode *root) { if(!root) return; if(root->left) root->left->next = root->right; if(root->ri转载 2014-03-12 17:29:47 · 524 阅读 · 0 评论 -
Binary Tree Postorder Traversal
方法一,递归遍历。class Solution {public: vector postorderTraversal(TreeNode *root) { vector result; if(root == NULL) return result; vector left = p转载 2014-03-11 18:13:14 · 447 阅读 · 0 评论