数据结构之二叉树的基础OJ练习二叉树的遍历

x33g5p2x  于2021-10-07 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(559)

二叉树的前序遍历

题目来源:二叉树的前序遍历

题目描述:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

  1. 输入:root = [1,null,2,3]
  2. 输出:[1,2,3]

示例 2:

  1. 输入:root = []
  2. 输出:[]

示例 3:

  1. 输入:root = [1]
  2. 输出:[1]

示例 4:

  1. 输入:root = [1,2]
  2. 输出:[1,2]

示例 5:

  1. 输入:root = [1,null,2]
  2. 输出:[1,2]

解题思路:

规则是若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,然后再前序遍历右子树。可以利用递归实现

代码如下:

因为题目要求我们返回前序遍历的结果,故我们需要开辟一个数组来保存前序遍历的结果,但是开辟时我们不知道数组的大小,故我们可以再写一个计算二叉树节点个数的函数,这样就明确了开辟的空间,然后我们写一个前序遍历的函数,只不过我们的这个前序遍历访问节点的方式变成了将当前节点的值赋给数组,最后返回该数组即可

  1. int TreeSize(struct TreeNode* root)
  2. {
  3. if(root==NULL)
  4. return 0;
  5. return TreeSize(root->left)+TreeSize(root->right)+1;
  6. }
  7. void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
  8. {
  9. //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
  10. if(root==NULL)
  11. return ;
  12. arr[(*pi)++]=root->val;
  13. _preorderTraversal(root->left,arr,&i);
  14. _preorderTraversal(root->right,arr,&i);
  15. }
  16. int* preorderTraversal(struct TreeNode* root, int* returnSize)
  17. {
  18. *returnSize = TreeSize(root);
  19. int *a = malloc(sizeof(int)*(*returnSize));
  20. int i=0;
  21. _preorderTraversal(root,a,&i);
  22. return arr;
  23. }

二叉树的中序遍历

题目来源:

二叉树的中序遍历

题目描述:
给定一个二叉树的根节点 root ,返回它的 中序 遍历。

示例 1:

  1. 输入:root = [1,null,2,3]
  2. 输出:[1,3,2]

示例 2:

  1. 输入:root = []
  2. 输出:[]

示例 3:

  1. 输入:root = [1]
  2. 输出:[1]

示例 4:

  1. 输入:root = [1,2]
  2. 输出:[2,1]

示例 5:

  1. 输入:root = [1,null,2]
  2. 输出:[1,2]

中序遍历和前序遍历是一样的,代码也直接将访问节点改在了先访问左子树后面,故就不说思路了,直接贴代码:

代码如下:

  1. int TreeSize(struct TreeNode* root)
  2. {
  3. if(root==NULL)
  4. return 0;
  5. return TreeSize(root->left)+TreeSize(root->right)+1;
  6. }
  7. void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
  8. {
  9. //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
  10. if(root==NULL)
  11. return ;
  12. _preorderTraversal(root->left,arr,&i);
  13. arr[(*pi)++]=root->val;
  14. _preorderTraversal(root->right,arr,&i);
  15. }
  16. int* preorderTraversal(struct TreeNode* root, int* returnSize)
  17. {
  18. *returnSize = TreeSize(root);
  19. int *a = malloc(sizeof(int)*(*returnSize));
  20. int i=0;
  21. _preorderTraversal(root,a,&i);
  22. return arr;
  23. }

二叉树的后序遍历

题目来源:

二叉树的后序遍历

题目描述:
给定一个二叉树,返回它的 后序 遍历。

示例:

  1. 输入: [1,null,2,3]
  2. 1
  3. \
  4. 2
  5. /
  6. 3
  7. 输出: [3,2,1]

后序遍历和前面两个遍历是一样的,代码也直接将访问节点改在了先访问左子树和右子树后面,故就不说思路了,直接贴代码:

代码如下:

  1. int TreeSize(struct TreeNode* root)
  2. {
  3. if(root==NULL)
  4. return 0;
  5. return TreeSize(root->left)+TreeSize(root->right)+1;
  6. }
  7. void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
  8. {
  9. //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
  10. if(root==NULL)
  11. return ;
  12. _preorderTraversal(root->left,arr,&i);
  13. _preorderTraversal(root->right,arr,&i);
  14. arr[(*pi)++]=root->val;
  15. }
  16. int* preorderTraversal(struct TreeNode* root, int* returnSize)
  17. {
  18. *returnSize = TreeSize(root);
  19. int *a = malloc(sizeof(int)*(*returnSize));
  20. int i=0;
  21. _preorderTraversal(root,a,&i);
  22. return arr;
  23. }

相关文章