IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode之二叉树---C语言 -> 正文阅读

[数据结构与算法]leetcode之二叉树---C语言

  1. 第一题
    在这里插入图片描述

    方法一:深度优先搜索
    (1)两个二叉树都为空,则相同。
    (2)两个二叉树只有一个为空,则不相同。
    (3)两个二叉树都不为空,可以判断根节点的值,若根节点的值相同再判断二叉树的左子树是否相同、右子树是否相同。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    bool isSameTree(struct TreeNode* p, struct TreeNode* q){
        //两个二叉树都为空,一定相同
        if(p==NULL && q==NULL)
        {
            return true;
        }
        else if ((p==NULL && q!=NULL) || (p!=NULL && q==NULL))  //两个二叉树只有一个为空,说明一定不相同
        {
            return false;
        }
        else if(p->val!=q->val) //根节点值不相同,说明一定不相同
        {
            return false;
        }
        else{
            return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);  //递归遍历左右子树
        }
    }
    

    方法二:使用迭代方法实现

  2. 第二题(二叉树的中序遍历)

    中序遍历:根节点在中间访问,正常顺序是左子树、根节点、右子树。

    方法一:递归。

     void inorder(struct TreeNode* root,int* res,int* resSize)
     {
         if(!root)   //空节点推出
         {
             return;
         }
         inorder(root->left,res,resSize);
         res[(*resSize)++]=root->val;
         inorder(root->right,res,resSize);
     }
     int* inorderTraversal(struct TreeNode* root, int* returnSize){
         int* res=malloc(sizeof(int)*501);
         *returnSize=0;
         inorder(root,res,returnSize);
         return res;
     }
    

    方法二:迭代:

     int* inorderTraversal(struct TreeNode* root, int* returnSize) {
         *returnSize = 0;
         int* res = malloc(sizeof(int) * 501);
         struct TreeNode** stk = malloc(sizeof(struct TreeNode*) * 501);
         int top = 0;
         while (root != NULL || top > 0) {
             while (root != NULL) {
                 stk[top++] = root;
                 root = root->left;
             }
             root = stk[--top];
             res[(*returnSize)++] = root->val;
             root = root->right;
         }
         return res;
     }
    
  3. 第三题(二叉树的后序遍历)

    后序遍历:根节点在最后访问,正常顺序是左子树、右子树、根节点,但是需要判断右子树是否存在,如果不存在,左节点后的节点是根节点。

    方法一:递归

      void inorder(struct TreeNode* root,int* res,int* resSize)
     {
         if(!root)   //空节点推出
         {
             return;
         }
         inorder(root->left,res,resSize);
         inorder(root->right,res,resSize);
         res[(*resSize)++]=root->val;
     }
     
     int* postorderTraversal(struct TreeNode* root, int* returnSize){
         //后序遍历,左子树、右子树、根节点
         int* res=malloc(sizeof(int)*2001);
         *returnSize=0;
         inorder(root,res,returnSize);
         return res;
     }
    

    方法二:迭代

     /**
     	 * Definition for a binary tree node.
     	 * struct TreeNode {
     	 *     int val;
     	 *     struct TreeNode *left;
     	 *     struct TreeNode *right;
     	 * };
     	 */
     /**
      * Note: The returned array must be malloced, assume caller calls free().
      */
     int* postorderTraversal(struct TreeNode* root, int* returnSize){
         //根节点最后,左子树,右子树,根节点
         int* res = malloc(sizeof(int)*2001);
         *returnSize=0;
         if(root==NULL){
             return res;
         }
     
         struct TreeNode** stk = malloc(sizeof(struct TreeNode*) *2001);
         int stk_top=0;
         struct TreeNode *prev = NULL;
         while(stk_top>0 || root !=NULL)
         {
             while(root != NULL)        
             {
                 stk[stk_top++] = root;
                 root = root->left;
             }
             root = stk[--stk_top];
             if(root -> right==NULL || root->right ==prev)  //无右子树的情况,更新根节点
             {
                 res[(*returnSize)++] = root->val;
                 prev=root;
                 root=NULL;
             }
             else    //正常迭代右子树
             {
                 stk[stk_top++] =root;
                 root = root->right;
             }
         }
         return res;
     }
    
  4. 第四题(二叉树的前序遍历)

    前序遍历:根节点在首尾,顺序是根节点、左子树、右子树。

    方法一:递归。

      void inorder(struct TreeNode* root,int* res,int* resSize)
     {
         if(!root)   //空节点推出
         {
             return;
         }
         res[(*resSize)++]=root->val;
         inorder(root->left,res,resSize);
         inorder(root->right,res,resSize);
     }
     int* preorderTraversal(struct TreeNode* root, int* returnSize) {
         //前序遍历,根节点在首位,根节点、左子树、右子树
         int* res = malloc(sizeof(int) * 2000);
         *returnSize = 0;
         inorder(root,res,returnSize);
         return res;
     }
    

    方法二:迭代。

     int* preorderTraversal(struct TreeNode* root, int* returnSize) {
         //前序遍历,根节点在首位,根节点、左子树、右子树
         int* res = malloc(sizeof(int) * 2000);
         *returnSize = 0;
         if (root == NULL) {  //如果根节点为空,直接返回空
             return res;
         }
     
         struct TreeNode* stk[2000];
         struct TreeNode* node = root;
         int stk_top = 0;
         while (stk_top > 0 || node != NULL) {
             while (node != NULL) {
                 res[(*returnSize)++] = node->val;
                 stk[stk_top++] = node;
                 node = node->left;
             }
             node = stk[--stk_top];
             node = node->right;
         }
         return res;
     }
    
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:57:51  更:2022-05-01 15:59:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:40:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码