目录
一、遍历
二叉树的遍历是指按某条搜索路径访问二叉树中的每个节点一次且只有一次。
按照根、左子树和右子树的访问先后顺序不同,二叉树的遍历可以有6种方案:DLR、LDR、LRD、DRL、RDL、RLD。
要求先左后右,可去掉后三种遍历方法,剩下DLR(先序遍历)、LDR(中序遍历)、LRD(后序遍历)
二、先序遍历
如果二叉树为空,则空操作,否则:①访问根节点;②先序遍历左子树;③先序遍历右子树。
注意:访问根,先序遍历左子树,左子树为空或已遍历才可以遍历右子树。
void preorder(Btree T){
if(T){
cout<<T->data<<" ";
preorder(T->lchild);
preorder(T->rchild);
}
}
练习题
1.新二叉树
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n;
char data,l,r;
typedef struct TreeNode {
int left,right;
}TreeNode;
TreeNode tree[26];//根据题意,1<=节点个数<=26,所以用一个tree数组保存,且节点值为唯一字母,所以可不用定义data,用下标表示值
void pre_order(int root){
if (root == -1) return;//树为空,则结束
char x=root+'a';
cout<<x<<"";
in_order(tree[root].left);
in_order(tree[root].right);
}
int main(){
scanf("%d",&n);
int root=-1;
for(int i=0;i<n;i++){
cin>>data>>l>>r;
int k=int(data-'a');
if(root==-1)root=k;
tree[k].left=-1;
tree[k].right=-1;
if(l!='*')tree[k].left=int(l-'a');
if(r!='*')tree[k].right=int(r-'a');
}
pre_order(root);
return 0;
}