将完全二叉树的数组形式改为链表形式

/*
 * 二叉树
 *
 * (将完全二叉树的数组形式改为链表形式)
 *
 *                          1
 *                     2              3
 *                 4              5       6             7
 *             8
 *
 */
#include <iostream>
#define MAX 10
using namespace std;

typedef struct btnode{
    int data;
    struct btnode * lchild;
    struct btnode * rchild;
}btnode;

int main() {
    int a[]={0,1,2,3,4,5,6,7,8};
    int n=8;
    btnode * root;
    btnode * create_bin(int arr[],int n,int i);
                           //数组先序建立二叉树,并返回根结点指针。下标从1开始
                //n是元素个数,i是计数器
    void trav_bi_preorder(btnode * root);    //先序遍历二叉树
    void trav_bi_inorder(btnode * root);    //中序遍历二叉树(递归算法)
    void trav_bi_inorder_nonrecur(btnode *root);      
                                                               //中序遍历二叉树(非递归算法)
    root=create_bin(a,n,1);
//      trav_bi_preorder(root);                    //12485367
    trav_bi_inorder(root);
    cout << endl;
    trav_bi_inorder_nonrecur(root);
    return 0;
}

//利用数组元素建立完全二叉树
btnode * create_bin(int arr[],int n,int i){
    btnode * root=(btnode *)malloc(sizeof(btnode));
    if(i<=n){
        root->data=arr[i];
        root->lchild=create_bin(arr,n,2*i);
        root->rchild=create_bin(arr,n,2*i+1);
        return root;
    }else{
        return NULL;
    }
}

//先序遍历二叉树(递归算法)
void trav_bi_preorder(btnode * root){
    if(root!=NULL){
        cout << root->data;
        trav_bi_preorder(root->lchild);
        trav_bi_preorder(root->rchild);
    }
}

//中序遍历二叉树(递归算法)
void trav_bi_inorder(btnode * root){
    if(root!=NULL){
        trav_bi_inorder(root->lchild);
        cout << root->data;
        trav_bi_inorder(root->rchild);
    }
}

/*
 * 中序遍历二叉树(非递归算法)
 *
 * 中序遍历就是:从根开始一直沿着左支的方向去走,走到头之后,最左边
 * 的结点作为第一个结点。然后沿途依次返回,遇到“分叉”的时候,向右边
 * 转一个结点的位置,然后再一直沿着左支的方向走,走到头之后。。。
 * 。。。一直到最后一个结点完事
 *
 * (这样用栈解决,每一个元素都是一个“中转站”,不断的回退,有中转就
 * 压入栈中。。。)
 */
void trav_bi_inorder_nonrecur(btnode *root){
    btnode * st[MAX],* p,*q;
    int top=-1;
    st[++top]=root;
    p=root;
    while(top!=-1){                             
                                       //所有元素都从栈里出,整个大前提就是栈不空
                                       //从当前结点一路向左
        while(p!=NULL){                    
            st[++top]=p->lchild;
            p=p->lchild;
        }
        top--;                        
                                //    上面的while一路向左,最后NULL一定入栈。
                    //所以要用这句话干掉NULL
                        //    下面的if,可能弹出元素的右子是NULL,故
                //NULL入栈,这时while不会执行,这句就干掉NULL;
                //若右子不为NULL,就会执行while,所以仍然需要这
                                //句话干掉NULL
        if(top!=-1){
            p=st[top--];
            cout << p->data;
            st[++top]=p->rchild;
            p=p->rchild;
        }
    }
}

 

posted on 2015-11-28 12:34  `Elaine  阅读(1532)  评论(0编辑  收藏  举报

导航