1. 二叉樹的前序遍歷
題目描述:給定一個二叉樹,返回它的前序遍歷。
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _preorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
retA[(*pi)++] = root->val;
_preorderTraversal(root->left,retA,pi);
_preorderTraversal(root->right,retA,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
//1.先開空間大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按前序遍歷,放入retA數組
int i =0;
_preorderTraversal(root,retA, &i);
//3.返回retA數組
return retA;
}
2. 二叉樹的中序遍歷
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _inorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
_inorderTraversal(root->left,retA,pi);
retA[(*pi)++] = root->val;
_inorderTraversal(root->right,retA,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
//1.先開空間大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按中序遍歷,放入retA數組
int i =0;
_inorderTraversal(root,retA, &i);
//3.返回retA數組
return retA;
}
3. 二叉樹的後續遍歷
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _postorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
_postorderTraversal(root->left,retA,pi);
_postorderTraversal(root->right,retA,pi);
retA[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
//1.先開空間大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按後序遍歷,放入retA數組
int i =0;
_postorderTraversal(root,retA, &i);
//3.返回retA數組
return retA;
}
4. 一顆樹的子樹
題目描述:給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。
分析:
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if(p==NULL && q==NULL)
return true;
if(p==NULL || q==NULL)
return false;
if(p->val !=q->val)
return false;
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* s, struct TreeNode* t){
if(s==NULL)
return false;
if(isSameTree(s,t))
return true;
return isSubTree(s->left,t) || isSubTree(s->right,t);
}
5. 平衡二叉樹
題目描述:給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義爲:一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過1.
int Depth(struct TreeNode* root){
if(root==NULL)
return 0;
int leftDepth = Depth(root->left);
int rightDepth = Depth(root->right);
return leftDepth > rightDepth ? leftDepth+1 : rightDepth +1;
}
bool isBalanced(struct TreeNode* root){
if(root==NULL)
return true;
int leftDepth =Depth(root->left);
int rightDepth=Depth(root->right);
return abs(leftDepth-rightDepth)<2 && isBalanced(root->left) && isBalanced(root->right);
}