常见算法之1---先序遍历二叉树

前序遍历:先遍历父节点,然后左子节点,然后右子节点。

下图的遍历顺序为:1245367

  

递归方式遍历:

基本思想:对一个树的访问,可以分成访问当前节点,访问左子树和访问右子树。而访问左右子树时又可以看做是上述步骤的重复,因此可以递归的调用。

代码流程:

void preOrder(TNode* root){
    if (root != NULL){
                 Visit(root);           //访问当前节点
                 preOrder(root->left);   //递归访问左子节点
                 preOrder(root->right);   //递归访问右子节点
             }
         }

非递归方式遍历:

基本思想:在访问途中将依次遇到的节点保存下来。由于节点出现次序与恢复次序是反序的,因此是一个先进后出结构,需要用栈。

代码流程:

void preOrder1(TNode* root){
    Stack S;
    while ((root != NULL) ||!S.empty()) {
        if (root != NULL) {
            Visit(root);
            S.push(root);       // 先访问,再入栈
            root = root->left;    // 依次访问左子树
        }
        else{
            root = S.pop();     // 回溯至父亲节点
            root = root->right;
        }
    }
}

 

注:将代码和开始时的附图一起看,能更好的理解。

posted @ 2013-08-05 21:11  欧麦高德  阅读(374)  评论(0编辑  收藏  举报