https://leetcode.cn/problems/binary-tree-preorder-traversal/
這道題目需要我們自行進行創建一個數組,題目也給出我們需要自己malloc一個數組來存放,這樣能達到我們遍歷的效果,我們來看看他的接口函數給的是什么。
可以看到的是這個接口函數給了一個root就是根節點的意思,但是這里的returnsize是什么意思可能有問題???
其實returnsize這里雖然給的是指針,是因為我們函數棧幀創建和銷毀的時候,形參只是實參的一份臨時拷貝,這樣的話,我們就算給returnsize賦值進行改變,也不能改變他的值
這里的returnsize是我們需要在這個函數外面統計數組的個數
我們來看這個題目的第一個問題就是我們要開辟一個數組,開辟數組的話我們是不是得知道這個數組空間有多大才行,所以我們得先寫一個函數就是統計節點的函數,那這個函數其實就是遍歷數組,用的就是遞歸的方式進行遍歷。
int BinaryTreeSize(struct TreeNode* root)
{if(root == NULL){return 0;}return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}
這個就是我們來統計有多少節點的函數,思想就是我們遇到空的時候就返回,不是空的時候就是得返回一個節點。下面我們就只需要在題目給的接口函數進行調用,然后malloc一個數組出來就行。
int* preorderTraversal(struct TreeNode* root, int* returnSize) {int n = BinaryTreeSize(root);int* arry = (int*)malloc(sizeof(int)*n);assert(arry);int size = 0;_preorderTraversal(root, arry, &size);*returnSize = n;return arry;}
然后我們需要做的就是實現我們遍歷函數的內容,其實很簡單,因為前序遍歷的時候是先中間節點,然后是他的左孩子和右孩子,所以我們的遞歸方法就出來了。
void _preorderTraversal(struct TreeNode* root, int* a,int* pi)
{if(root == NULL){return ;}a[(*pi)++] = root->val;_preorderTraversal(root->left, a, pi);_preorderTraversal(root->right, a, pi);}
這里需要注意的地方就是pi這個值我們是需要取出他的地址進行,因為如果不是地址的話,我們每次函數遞歸的時候建立函數棧幀的時候就是會有問題,每次都是局部變量,所以我們得用他的地址,這個也就是為什么我們的size是取地址傳進來的,而不是直接傳0,因為傳0的話,形參只是實參的一份臨時拷貝,改變形參并不會對實參有任何的影響。
謝謝大家觀看,我們下次再見。
?