二叉樹基礎面試題2(力扣)

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);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章