【每日刷題】Day48
🥕個人主頁:開敲🍉
🔥所屬專欄:每日刷題🍍
🌼文章目錄🌼
1.?872. 葉子相似的樹 - 力扣(LeetCode)
2.?114. 二叉樹展開為鏈表 - 力扣(LeetCode)
1.?872. 葉子相似的樹 - 力扣(LeetCode)
//思路:將兩個二叉樹的葉子節點分別存入兩個數組中,使用memcmp函數比較兩個數組中的內容是否相同從而判斷兩樹是否葉子相似
bool IsLeafNode(struct TreeNode* root)
{
? ? return !root->left&&!root->right;
}
?void GetLeafVal(struct TreeNode* root,int* arr,int* size)
{
? ? if(root==NULL)
? ? {
? ? ? ? return;
? ? }
? ? if(IsLeafNode(root))
? ? {
? ? ? ? arr[(*size)++] = root->val;
? ? ? ? return;
? ? }
? ? GetLeafVal(root->left,arr,size);
? ? GetLeafVal(root->right,arr,size);
}
bool leafSimilar(struct TreeNode* root1, struct TreeNode* root2)
{
? ? int arr1[200];
? ? int arr2[200];
? ? int size1 = 0;
? ? int size2 = 0;
? ? GetLeafVal(root1,arr1,&size1);
? ? GetLeafVal(root2,arr2,&size2);
? ? if(size1!=size2)
? ? {
? ? ? ? return false;
? ? }
? ? int ret = memcmp(arr1,arr2,sizeof(int)*size1);
? ? return ret==0;
}
2.?114. 二叉樹展開為鏈表 - 力扣(LeetCode)
//思路:先序遍歷二叉樹,將每個結點的值存入一個數組中,隨后創建新的結點存儲數組中的每個元素,從二叉樹的根節點開始,將left指針置為NULL,right指針指向下一個創建的新結點。
typedef struct TreeNode TN;
//先序遍歷存儲二叉樹結點void GetNodeVal(TN* root,int* arr,int* size)
{
? ? if(root==NULL)
? ? {
? ? ? ? return;
? ? }
? ? arr[(*size)++] = root->val;
? ? GetNodeVal(root->left,arr,size);
? ? GetNodeVal(root->right,arr,size);
}
//創建新結點存儲數組中的元素,將結點的left置為NULL,right指向下一個創建的結點
TN* ListTree(int* arr,int size,int* num)
{
? ? if((*num)==size)
? ? {
? ? ? ? return NULL;
? ? }
? ? TN* node = (TN*)malloc(sizeof(TN));
? ? node->val = arr[(*num)++];
? ? node->left = NULL;
? ? node->right = ListTree(arr,size,num);
? ? return node;
}
?void flatten(struct TreeNode* root)
{
? ? if(root==NULL)
? ? {
? ? ? ? return;
? ? }
? ? int arr[2001] = {0};
? ? int size = 0;
? ? GetNodeVal(root,arr,&size);
? ? int num = 1;
? ? root->left = NULL;
? ? root->right = ListTree(arr,size,&num);
}