【LeetCode】—— 二叉树基础面试题(上)

一、二叉树的前序遍历(递归实现)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;   
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值