二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数
前序遍历重构二叉树
思路
- 整个二叉树用数组存储
- 因为先序遍历它先遍历根,再遍历左,左边没有跑完是不会去遍历右边的,所以遍历左子树,就是数组元素每回向后一个,个数-1
- 遍历右边时,就是数组起始位置+左子树跑到的位置+每次往后走一个,大小就是减去左子树用掉的个数+每回个数-1
- 因为要返回遍历的位置,和遍历用掉的个数,所以每回都要返回两个值,用结构体返回。
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct TreeNode
{struct TreeNode *left;struct TreeNode *right;char val;
}TreeNode;typedef struct Result{TreeNode * root; //构建的树的根结点int used; //构建过程中用掉的val个数
} Result;Result CreateTree(char preorder[], int size){if (size == 0){Result result;result.root = NULL;result.used = 0;return result;}char rootVal = preorder[0];if (rootVal == '#'){Result result;result.root = NULL;result.used = 1; //'#'号在数组中也占一个位置return result;}//根的过程TreeNode * root = (TreeNode *)malloc(sizeof(TreeNode));root->val = rootVal;root->left = root->right = NULL;//左子树Result left_result = CreateTree(preorder + 1, size - 1);//右子树Result right_result = CreateTree(preorder + 1 + left_result.used, size - 1 - left_result.used);root->left = left_result.root;root->right = right_result.root;Result result;result.root = root;result.used = 1 + left_result.used + right_result.used;return result;
}void InorderTraversal(TreeNode * root){if (root == NULL){return;}InorderTraversal(root->left);printf("%c", root->val);printf(" ");InorderTraversal(root->right);
}void TestCreateTree()
{char preorder[200];scanf("%s", preorder);int size = strlen(preorder);Result result = CreateTree(preorder, size);InorderTraversal(result.root);
}int main()
{TestCreateTree();return 0;
}
求二叉树中所有结点的个数
思路
遍历整棵树,不是空结点,个数就++
void TreeSize(TreeNode *root, int *size){if (root == NULL){return;}(*size)++;TreeSize(root->left,size);TreeSize(root->right,size);}
思路2
根+左结点个数+右结点个数
int TreeSize2(TreeNode *root){if (root == NULL){return 0;}return 1 + TreeSize2(root->left) + TreeSize2(root->right);
}
二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数相关推荐
- 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)
文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...
- 二叉树已知前序遍历、中序遍历画出二叉树的形状
前序遍历: 前序遍历(VLR)是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1)访问根 ...
- 二叉树题目---3 另一个树的子树 AND 二叉树最大深度
另一个树的子树 思路 两个数都遍历一遍,找到一个根结点相同时,判断以这个根结点为首的二叉树是否相等 前序遍历 判断两棵树是否相同 对于返回值的处理是难点 bool isSameTree(struct ...
- 二叉树的三种遍历方式:先序,中序,后序
二叉树遍历基础概念分析: 遍历:编写程序时,读取二叉树中内容的顺序(本人理解为此). 先序/中序/后序:二叉树的先序,中序,后序中的"先中后"是相对于"根"而言 ...
- 二叉树题目 ----7 前序中序遍历构造二叉树
前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...
- 二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* s ...
- 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列
题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...
- 二叉树的的前序遍历和后序遍历(题型变种更新中)
变形一 BM32 合并二叉树 描述 已知两颗二叉树,将它们合并成一颗二叉树.合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替.例如: 两颗二叉树是: ...
- 【二叉树迭代版前序遍历】LeetCode 144. Binary Tree Preorder Traversal
LeetCode 144. Binary Tree Preorder Traversal Solution1:递归版 二叉树的前序遍历递归版是很简单的,前序遍历的迭代版相对是最容易理解的. 迭代版链接 ...
最新文章
- 深入浅出计算机组成原理学习笔记:高速缓存(下)-你确定你的数据更新了么?(第38讲)...
- AVCaptureMovieFileOutput 视频方向(锁定竖屏or不锁定都可以)
- Android开发教程之--sql语句一、创建/删除表Stringsql=Createtable
- Java中的推断异常
- 【kafka】Kafka消息压缩与解压与相关实验
- 使用expect编写脚本
- windows系统bat批处理 一键配置java jdk环境变量
- 比Google Map更加清晰的网络地图——RealBird
- matlab程序及C语言实现一维多元离散信源熵
- wsimport命令
- (简单控制) 关于使用NI max 的GPIB来控制安捷伦万用表34401A 的操作方法
- 服务器在外国那么登录网站算,国外服务器网站好吗?好在哪?
- PowerDesigner使用教程 —— 概念数据模型(CDM模型)
- Electron 使用 regedit 控制注册表(实现win文件右键菜单)
- 大学计算机英语要求,2015级本科生大学英语、计算机分级考试要求.doc
- 设计模式:工厂模式和建造者模式
- 《2018人工智能芯片技术白皮书》发布
- 军民链智合创:BitCEO.world比特维度全球CEO发展大会@台北HiFi++
- 基于 Traefik 的 ForwardAuth 配置
- JMeter安装及环境配置