前情回顾
基础方法
按照根结点的遍历顺序划分
1.前序遍历:根->左->右
2.中序遍历:左->根->又
3.后序遍历:左->右->根
前序遍历:E,B,A,D,C,G,F,H
中序遍历:A,B,C,D,E,F,G,H
后序遍历:A,C,D,B,F,H,G,E
代码
//获取整个树中所有的键
void preErgodic(){
preErgodic(root);
}
//获取指定树x的所有键,并放到keys队列中
void preErgodic(Node<Value>* x){
if (x==nullptr){
return;
}
//把x结点的key放入到keys中
std::cout<<x->key<<std::endl;
//递归遍历x结点的左子树
if (x->left!=nullptr){
preErgodic(x->left);
}
//递归遍历x结点的右子树
if (x->right!=nullptr){
preErgodic(x->right);
}
}
//中序遍历
//获取整个树中所有的键
void midErgodic(){
midErgodic(root);
}
//获取指定树x的所有键,并放到keys队列中
void midErgodic(Node<Value>* x){
if (x==nullptr){
return;
}
//递归遍历x结点的左子树
if (x->left!=nullptr){
midErgodic(x->left);
}
//把x结点的key放入到keys中
std::cout<<x->key<<std::endl;
//递归遍历x结点的右子树
if (x->right!=nullptr){
midErgodic(x->right);
}
}
//后序遍历
//获取整个树中所有的键
void afterErgodic(){
afterErgodic(root);
}
//获取指定树x的所有键,并放到keys队列中
void afterErgodic(Node<Value>* x){
if (x==nullptr){
return;
}
//递归遍历x结点的左子树
if (x->left!=nullptr){
afterErgodic(x->left);
}
//递归遍历x结点的右子树
if (x->right!=nullptr){
afterErgodic(x->right);
}
//把x结点的key放入到keys中
std::cout<<x->key<<std::endl;
}
层序遍历
从第一层到最后一层逐层遍历:
1.创建一个辅助队列遍历结点
2.将根结点传入队列中
3.循环如果队列不为空取出队列中的结点,输出该结点的key值
4.判断当前结点的左子节点是否为空,如果不为空则将左子节点插入队列
5.判断当前结点的右子节点是否为空,如果不为空则将右子节点插入队列
层序遍历:E,B,G,A,D,F,H,C
代码
//层序遍历
void layerErgodic(){
//创建辅助队列用于遍历每一层的结点
Queue<Node<Value>> nodes;
nodes.enqueue(*root);
Node<Value> x;
while(!nodes.isempty()){
x = nodes.dequeue();
std::cout << x.key <<',';
if(x.left != nullptr) nodes.enqueue(*x.left);
if(x.right != nullptr) nodes.enqueue(*x.right);
}
std::cout << std::endl;
}