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


    /*
     * 二叉树
     *
     * (将完全二叉树的数组形式改为链表形式)
     *
     *                          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;
            }
        }
    }
  • 相关阅读:
    操作系统开发系列—13.g.操作系统的系统调用 ●
    操作系统开发系列—13.f.Minix的中断处理(暂时忽略)
    操作系统开发系列—13.e.三进程
    操作系统开发系列—13.d.多进程 ●
    操作系统开发系列—解释typedef void (*int_handler) ();
    操作系统开发系列—13.c.进程之中断重入
    操作系统开发系列—13.b.进程之丰富中断处理程序
    操作系统开发系列—13.a.进程 ●
    操作系统开发系列—12.g.在内核中设置键盘中断
    操作系统开发系列—12.f.在内核中添加中断处理 ●
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5002488.html
Copyright © 2020-2023  润新知