leetcodeブラシノート-ツリー2
34416 ワード
leetcode 101:
leetcode 104:
leetcode 105:
leetcode 106:この問題は前の問題と同じ方法です.
/*
, 。
, [1,2,2,3,4,4,3] 。
1
/ \
2 2
/ \ / \
3 4 4 3
[1,2,2,null,3,null,3] :
1
/ \
2 2
\ \
3 3
: (LeetCode)
:https://leetcode-cn.com/problems/symmetric-tree
。 , 。
*/
/*
, ,
*/
#include
#include
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL)
{
return true;
}
else
{
return DFS(root->left,root->right);
}
}
bool DFS(TreeNode *rootleft,TreeNode *rootright)
{
// NULL
if (rootleft == NULL && rootright == NULL)
{
return true;
}
// NULL
if ((rootleft == NULL && rootright != NULL) || (rootleft != NULL && rootright == NULL))
{
return false;
}
// ,
auto res = rootleft->val == rootright->val && DFS(rootleft->left, rootright->right) && DFS(rootleft->right,rootright->left);
return res;
}
};
leetcode 104:
/*
, 。
。
*/
#include
#include
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {
}
};
class Solution
{
public:
int maxDepth(TreeNode* TreeNode)
{
if (TreeNode == NULL)
{
return 0;
}
else
{
int left_depth = maxDepth(TreeNode->left);
int right_depth = maxDepth(TreeNode->right);
return max(left_depth, right_depth) + 1; // 1 0
}
}
};
leetcode 105:
/*
。
:
。
,
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
:
3
/ \
9 20
/ \
15 7
: (LeetCode)
:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
。 , 。
*/
/*
: - -
: - -
, , ,
*/
#include
#include
using std::vector;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
std::cout << " " << std::endl;
if (preorder.size() == 0 || inorder.size() == 0)
{
return NULL;
}
else
{
return build(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
}
public:
TreeNode* build(vector<int>& preorder, int ps, int pe, vector<int>& inorder, int is, int ie)
{
//
TreeNode* root = new TreeNode(preorder[ps]);
root->left = NULL;
root->right = NULL;
//
int rootval = preorder[ps];
// , ,
//
int mid = 0;
for (int i = is; i <= ie; i++)
{
if (rootval == inorder[i])
{
mid = i;
break;
}
}
//
int leftlen = mid - is;
int rightlen = ie - mid;
//
if (leftlen > 0)
{
// ,
root->left = build(preorder, ps+1,ps+leftlen , inorder, is, is+leftlen-1);
}
if (rightlen > 0)
{
root->right = build(preorder,ps+leftlen+1,pe,inorder,is+leftlen+1,ie);
}
return root;
}
};
leetcode 106:この問題は前の問題と同じ方法です.
/*
。 。
:
。
,
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
:
3
/ \
9 20
/ \
15 7
: (LeetCode)
:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
。 , 。*/
/*
:
: - -
,
*/
#include
#include
using std::vector;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0 || postorder.size() == 0)
{
return NULL;
}
else
{
return build(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
}
public:
TreeNode* build(vector<int>& inorder, int is, int ie, vector<int>& postorder, int ps, int pe)
{
//
TreeNode* root = new TreeNode(postorder[pe]);
root->left = NULL;
root->right = NULL;
int rootval = postorder[pe];
// , ,
//
int mid = 0;
for (int i = is; i <= ie; i++)
{
if (rootval == inorder[i])
{
mid = i;
break;
}
}
int leftlen = mid - is;
int rightlen = ie - mid;
if (leftlen > 0)
{
root->left = build(inorder, is, is + leftlen - 1, postorder, ps, pe - 1 - rightlen);
}
if (rightlen > 0)
{
root->right = build(inorder, is + leftlen + 1, ie, postorder, pe - rightlen, pe - 1);
}
return root;
}
};