关于二叉树(2)

二叉树的节点数量

一棵高度为 n 的二叉树,最多包括 个节点。

二叉树的存储

可以继续沿用存储树的方法,来存储二叉树。

cpp 复制代码
struct node{
    int value;
    vector<int> childs; //用来记录所有子节点的编号
}nodes[10000];

int root;
//root为根节点

也可以利用二叉树的特性,用左右子树的方式,来存储二叉树。

用结构体来表示二叉树的节点, 每个节点存储了当前节点的值, 以及左子树和右子树的编号。

cpp 复制代码
struct node{
    int value;
    int left;
    int right;
}nodes[10000];
int root;
//root为根节点

二叉树的遍历

遍历二叉树的方法可以沿用遍历树的方法------递归。

复制代码
DFS(当前节点u){
    DFS(u.left);
    DFS(u.right);
}

在此基础上,二叉树的遍历又分为以下三种:

顺序
先序遍历 根 左 右
中序遍历 左 根 右
后序遍历 左 右 根
先序遍历

遍历顺序规则为:根左右,遍历方法:

(1)访问根节点

(2)采用先序递归遍历左子树

(3)采用先序递归遍历右子树

示例代码:

cpp 复制代码
/*题目:
输入一个整数n(n <= 100000),表示二叉树中节点个数,编号为1~n。约定1号节点为二叉树的根节点。
然后输入n行,每行包括两个整数,第i行表示编号为i的节点的左子节点和右子节点的编号。
如果某个节点没有左子节点,那么对应输行的第一个整数为0;如果某个节点没有右子节点,
那么对应行的第二个整数为0。
先序遍历输出此二叉树每个节点的编号,每行输出一个编号。
先序遍历(DLR),是二叉树遍历的一种,也叫做先根遍历、前序遍历、前序周游,可记做根左右。
前序遍历首先访问根节点然后遍历左子树,最后遍历右子树。
*/
#include<bits/stdc++.h>
using namespace std;
int n;
struct link{
	int left;
	int right;
}a[100005];
void dfs(int x){
	if(x==0) return ;
	cout<<x<<endl;
	dfs(a[x].left);
	dfs(a[x].right);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[i].left=x;
		a[i].right=y;
	}
	dfs(1);
	return 0;
}
中序遍历

遍历顺序规则为:左根右,遍历方法:

(1)采用中序遍历左子树

(2)访问根节点

(3)采用中序遍历右子树

示例代码:

cpp 复制代码
/*题目:
输入一个整数n(n <= 100000),表示二叉树中节点个数,编号为1~n。约定1号节点为二叉树的根节点。
然后输入n行,每行包括两个整数,第i行表示编号为i的节点的左子节点和右子节点的编号。
如果某个节点没有左子节点,那么对应输行的第一个整数为0;如果某个节点没有右子节点,
那么对应行的第二个整数为0。
中序遍历输出此二叉树每个节点的编号,每行输出一个编号。
*/
#include<bits/stdc++.h>
using namespace std;
int n;
struct link{
	int left,right;
}a[100005];
void dfs(int x){
	if(x==0) return ;
	dfs(a[x].left);
	cout<<x<<endl;
	dfs(a[x].right);
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[i].left=x;
		a[i].right=y;
	} 
	dfs(1);
	return 0;
}

后序遍历

遍历顺序规则为:左右根,遍历方法:

(1)采用后序递归遍历左子树

(2)采用后序递归遍历右子树

(3)访问根节点

示例代码:

cpp 复制代码
/*题目:
输入一个整数n(n <= 100000),表示二叉树中节点个数,编号为1~n。
约定1号节点为二叉树的根节点。然后输入n行,每行包括两个整数,
第i行表示编号为i的节点的左子节点和右子节点的编号。
如果某个节点没有左子节点,那么对应输行的第一个整数为0;如果某个节点没有右子节点,
那么对应行的第二个整数为0。 后序遍历输出此二叉树每个节点的编号,每行输出一个编号。
*/
#include<bits/stdc++.h>
using namespace std;
int n;
struct link{
	int left,right;
}a[100005];
void dfs(int x){
	if(x==0) return ;
	dfs(a[x].left);
	dfs(a[x].right);
	cout<<x<<endl;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[i].left=x;
		a[i].right=y;
	} 
	dfs(1);
	return 0;
} 
相关推荐
无忧.芙桃6 分钟前
数据结构之排序算法(上):从评价指标到插入、希尔、选择与堆排序
c语言·c++·排序算法
syagain_zsx9 分钟前
算法基础篇 · 02 高精度(C++ 题解)
开发语言·c++·学习·高精度
6Hzlia10 分钟前
【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线
c++·算法·leetcode
wabs66613 分钟前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
6Hzlia32 分钟前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 双游标区间扫描与 to_string 规范
c++·算法·leetcode
LuminousCPP1 小时前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
纪念 2291 小时前
C++类和对象(二)
开发语言·c++
钓鱼的肝2 小时前
csp-j-s总结(1)
c++·笔记·算法·青少年编程
linx2952 小时前
第七章 · 标准库容器、算法与 ranges
c语言·开发语言·数据结构·c++·算法
钓鱼的肝2 小时前
csp-j-s总结(4)
c++·经验分享·笔记·算法