zoukankan      html  css  js  c++  java
  • 将完全二叉树的数组形式改为链表形式

    /*
     * 二叉树
     *
     * (将完全二叉树的数组形式改为链表形式)
     *
     *                          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;
            }
        }
    }
  • 相关阅读:
    DPDK安装方法 17.12.13
    numa.h:No such file or directory 解决方法
    17秋 软件工程 第六次作业 Beta冲刺 Scrum3
    17秋 软件工程 第六次作业 Beta冲刺 总结博客
    17秋 软件工程 第六次作业 Beta冲刺 Scrum2
    Paper Reviews and Presentations
    17秋 软件工程 第六次作业 Beta冲刺 Scrum1
    17秋 软件工程 第六次作业 Beta冲刺
    error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
    17秋 软件工程 个人作业 软件产品案例分析
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5002488.html
Copyright © 2011-2022 走看看