二叉樹-よくある簡単なアルゴリズムの問題
8391 ワード
篇一:二叉樹-最終版を遍歴します.二叉樹-創建、再構成、転化編三:二叉樹-詳細解二叉並べ替え木編四:二叉樹-詳細解バランス二叉樹AVL篇五:二叉樹-一般的な簡単なアルゴリズム問題
二叉の木の高さを求めます
上に最大の深さ(つまり二叉の高さ)を求めてみます.下に最小の深さを求めます.
再帰版:
二叉の木の高さを求めます
int maxDepth(TreeNode* root)
{
if(!root) return 0;
else
{
int left=maxDepth(root->left);
int right=maxDepth(root->right);
return 1+max(left,right);
}
}
二叉の木の最小の深さを求めます.上に最大の深さ(つまり二叉の高さ)を求めてみます.下に最小の深さを求めます.
int minDepth(TreeNode* root)
{
if (root == NULL) return 0;
if (root->left == NULL)
return minDepth(root->right) + 1;
else if (root->right == NULL)
return minDepth(root->left) + 1;
else
return min(minDepth(root->left), minDepth(root->right)) + 1;
}
二叉樹の高さのバランスを判断します.bool isBalanced(TreeNode* root)
{
if(!root) return true;
if(abs(maxDepth(root->left)-maxDepth(root->right))>1)
return false;
return isBalanced (root->left)&&isBalanced(root->right);
}
二つの二叉の木が等しいかどうかを判断します.bool isSameTree(TreeNode* p, TreeNode* q)
{
if(!p&&!q)
return true;
if(p&&!q||!p&&q||p->val!=q->val)
return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
二叉の木は対称の木かどうかを判断します. bool Symmetry(TreeNode* left, TreeNode* right)
{
if(!left && !right) return true;
if(!left || !right) return false;
if(left->val != right->val) return false;
return Symmetry(left->left, right->right) && Symmetry(left->right, right->left);
}
bool isSymmetric(TreeNode* root)
{
if(root==NULL) return true;
else
return Symmetry(root->left,root->right);
return false;
}
フォークを反転再帰版:
TreeNode *invertTree(TreeNode *root)
{
if (root == NULL) return NULL;
TreeNode *tempRight = root->right;
root->right = invertTree(root->left);
root->left = invertTree(tempRight);
return root;
}
上で交換しないでください.std:swapで直接実現できます.TreeNode* invertTree(TreeNode* root) {
if (root==NULL) return NULL;
invertTree(root->left);
invertTree(root->right);
std::swap(root->left, root->right);
return root;
}
再帰版ではない: TreeNode* invertTree(TreeNode* root)
{
if(!root) return NULL;
queue myqueue;
myqueue.push(root);
while(myqueue.size()>0)
{
TreeNode* pnode=myqueue.front();
myqueue.pop();
if(pnode)
{
myqueue.push(pnode->left);
myqueue.push(pnode->right);
TreeNode* pleft=pnode->left;
pnode->left=pnode->right;
pnode->right=pleft;
}
}
return root;
}
これはもちろんstdを使ってもいいです.swap、コードは以下の通りです. TreeNode* invertTree(TreeNode* root)
{
if(!root) return NULL;
queue myqueue;
myqueue.push(root);
while(myqueue.size()>0)
{
TreeNode* pnode=myqueue.front();
myqueue.pop();
if(pnode)
{
myqueue.push(pnode->left);
myqueue.push(pnode->right);
std::swap(pnode->left,pnode->right);
}
}
return root;
}