今天的题目是二叉树的三种遍历方式,有一说一,自己对于二叉树确实没有了解,所以看这三道题目是确实有点不知从何下手,但当自己看完前序遍历的解答后,恍然大悟,感叹递归算法的巧妙,自己对于递归的接触也确实很少,没有递归的思想,下面给出三种遍历的代码:
//前序遍历
void preorder(struct TreeNode* root, int* res, int* resSize) {
if (root == NULL) {
return;
}
res[(*resSize)++] = root->val;
preorder(root->left, res, resSize);
preorder(root->right, res, resSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
int* res = malloc(sizeof(int) * 100);
*returnSize = 0;
preorder(root, res, returnSize);
return res;
}
//中序遍历
void in_order(struct TreeNode* root, int *data, int* returnSize) {
if (root == NULL)
return;
in_order(root->left, data, returnSize);
data[(*returnSize)++] = root->val;
in_order(root->right, data, returnSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = 0;
if (root == NULL)
return NULL;
int *data = (int *)malloc(sizeof(int) * 100);
in_order(root, data, returnSize);
return data;
}
//后序遍历
void post_order(struct TreeNode *root, int *ret,int *returnSize) {
if (root == NULL)
return;
post_order(root->left, ret, returnSize);
post_order(root->right, ret, returnSize);
ret[(*returnSize)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = 0;
if (root == NULL)
return NULL;
int *ret = (int *)malloc(sizeof(int) * 100);
struct TreeNode **nodelist = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * 100);
post_order(root, ret, returnSize);
return ret;
}
上面的写法利用了递归的思想,看到代码随想录提到了利用迭代以及栈的方式也能实现三种遍历,感叹栈之巧妙,具体写法这里不给出了,具体详见代码随想录
今天花了比较多的时间在看二叉树以及二叉树的遍历上,尤其是迭代求解的方法,比较难理解,加油!