二分搜索树的遍历

来源:互联网 发布:mac 安装virtualbox 编辑:程序博客网 时间:2024/06/04 18:33

对于一棵二叉树来说,如果我们想要把这棵树中的所有节点都给遍历一遍,那么我们就需要了解二叉树的遍历方式。


二叉树的遍历方式分为以下三种:



二叉树的一个简单的结构如下图所示:


 对于其中的“前”。“中”,“后”,我们都可以理解为是根节点的访问顺序。

遍历时,我们分为三个阶段:前 中 后

对于前序遍历来说:也就是在前阶段访问根节点,中阶段访问左节点,后阶段访问右节点。(即根->左->右)

对于中序遍历来说:在中阶段访问根节点,前阶段访问左节点,后阶段访问右节点。(即左->中->右)

对于后序遍历来说:在后阶段访问根节点,前阶段访问左节点,中阶段访问右节点。(即左->右->根)


以下是相应的遍历代码:

前序遍历:

//以前序遍历来遍历以root为根节点的二叉树    void preorder(node*node){        if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止            cout<<node->key<<' ';//前阶段            preorder(node->left);//中阶段            preorder(node->right);//后阶段        }    }


中序遍历:

//中序遍历以node为根的二叉树    void inorder(node*node){        if(node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止            inorder(node->left);            cout << node->key << ' ';            inorder(node->right);        }    }

后序遍历:

//以后序遍历的方式遍历以root为根的二叉树    void postorder(node*node){        if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止            postorder(node->left);            postorder(node->right);            cout<<node->key<<' ';        }    }

对于需要遍历一个二叉树做一定的事情的时候,我们用前序遍历就够了,但是中序遍历和后序遍历也有他们存在的意义。

因为中序遍历的定义,先访问左子树,后根,然后访问右子树,而二叉树的结构特点为根左边的左子树一定小于根,根右边的右子树一定大于根。因此我们按照中序遍历的出来的顺序刚好是从小排到大的。

对于后序遍历来说,因为后序遍历是最后访问根的,而对于二叉树的释放来说,首先得释放根的左右子树,然后在释放根(如果先释放根,则丢失了root->left和root->right的信息,则不能知道左右子树的地址,从而无法正常的释放完全),这刚好符合了后序遍历的特点。因此,可以用后序遍历来释放二叉树。


下面是二叉树的析构函数实现方法(利用了后序遍历)

//删除以node为根的二叉树    void deletetree(node*node){        if(node!=NULL){//先利用根中包含了叶子信息的特点去先删除叶子节点            deletetree(node->left);            deletetree(node->right);            delete node;//最后删除根节点            count--;        }    }

以下是我们的测试数据:


 BST<int,int> a=BST<int,int>();    cout<<a.size()<<endl;    if(a.isempty()) cout<<"the tree is empty"<<endl;    a.insert(3,4);    a.insert(2,4);    a.insert(9,4);    a.insert(1,4);    a.preorder();    cout<<endl;    a.inorder();    cout<<endl;    a.postorder();



下面是输出的结果:

0
the tree is empty
3 2 1 9
1 2 3 9
1 2 9 3








原创粉丝点击