一、二叉树的前序遍历(递归实现)LeetCode144题

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

示例:

输入: [1,null,2,3]  
      1
        \
         2
        /
       3 

输出: [1,2,3]

1.2 解题思路
二叉树基础面试题(上)
1.3 代码实现

int treeSize(struct TreeNode* root)//计算所遍历二叉树节点的个数
{
    if(root == NULL)
        return 0;
    else
        return treeSize(root->left)+treeSize(root->right)+1;
}
//为方便递归构造的子函数
void _preorderTraversal(struct TreeNode* root,int* preorder,int* pindex)
{
    if(root == NULL)
        return;
    
    preorder[*pindex] = root->val;//访问根节点
    ++(*pindex);
    
    _preorderTraversal(root->left,preorder,pindex);//访问左子树
    _preorderTraversal(root->right,preorder,pindex);//访问右子树
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* preorder = (int*)malloc(*returnSize * sizeof(int));
    
    int index = 0;
    _preorderTraversal(root,preorder,&index);
    
    return preorder;
}

二、二叉树的中序遍历(递归实现)LeetCode94题

2.1 题目描述

给定一个二叉树,返回它的 中序 遍历。

示例:

输入: [1,null,2,3]  
      1
        \
         2
        /
       3 

输出: [1,3,2]

2.2 解题思路
代码大致与前序相同,只是先遍历左子树,再根节点,再右子树,一样定义一个数组inorder,记录中序遍历的结果。
2.3 代码实现

int treeSize(struct TreeNode* root)
{
    if(root == NULL)
        return 0;
    else
        return treeSize(root->left)+treeSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root,int* postorder,int* pindex)
{
    if(root == NULL)
        return;
    
     _postorderTraversal(root->left,postorder,pindex);
      postorder[*pindex] = root->val;
      ++(*pindex);
     _postorderTraversal(root->right,postorder,pindex);
    
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* postorder = (int*)malloc(*returnSize*sizeof(int));
    
    int index = 0;
    _postorderTraversal(root,postorder,&index);
    
    return postorder;
}

三、二叉树的后序遍历(递归实现)LeetCode144题

3.1 题目描述

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]  
      1
        \
         2
        /
       3 

输出: [3,2,1]

3.2 解题思路
代码大致与前序相同,只是先遍历左子树,再右子树,再根节点,一样定义一个数组postorder,记录后序遍历的结果。
3.3 代码实现

int treeSize(struct TreeNode* root)
{
    if(root == NULL)
        return 0;
    else
        return treeSize(root->left)+treeSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root,int* postorder,int* pindex)
{
    if(root == NULL)
        return;
    
    _postorderTraversal(root->left,postorder,pindex);
     _postorderTraversal(root->right,postorder,pindex);
    postorder[*pindex] = root->val;
    ++(*pindex);
    
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* postorder = (int*)malloc(*returnSize*sizeof(int));
    
    int index = 0;
    _postorderTraversal(root,postorder,&index);
    
    return postorde;
    }

四、相同的树LeetCode100题

4.1 题目描述
给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:        1          1
           /  \       /  \
          2    3      2   3

        [1,2,3],   [1,2,3]

输出: true

示例 2:

输入:      1          1
          /            \
         2              2

        [1,2],     [1,null,2]

输出: false

示例 3:

输入:       1         1
           / \       / \
          2   1     1   2
 
        [1,2,1],   [1,1,2]

输出: false

4.2 解题思路
二叉树基础面试题(上)
4.3 代码实现

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL)
        return true;
    else if(p != NULL && q != NULL)
    {
        return p->val == q->val
            && isSameTree(p->left,q->left)
            && isSameTree(p->right,q->right);
    }
    else
        return false;   
}

相关文章:

  • 2021-10-24
  • 2021-10-08
  • 2021-09-11
  • 2021-12-16
  • 2021-09-10
  • 2021-06-28
  • 2021-07-29
猜你喜欢
  • 2021-08-25
  • 2022-12-23
  • 2021-08-13
  • 2022-12-23
  • 2021-10-09
  • 2021-09-27
相关资源
相似解决方案