C++二叉查找树遍历

前情回顾

队列模板实现
二叉查找树实现

基础方法

按照根结点的遍历顺序划分
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;
    }
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值