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

/*
 * 二叉树
 *
 * (将完全二叉树的数组形式改为链表形式)
 *
 *                          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;
        }
    }
}
时间: 2024-12-17 13:48:18

将完全二叉树的数组形式改为链表形式的相关文章

织梦栏目列表目录形式改成链接形式默认页

改变后的最终效果: 第一步 修改栏目保存目录和默认页 第二步 打开 /include/helpers/channelunit.helper.php 找到 大概在251行 1 if($cfg_typedir_df=='N' || $isdefault==0) $reurl = $typedir.'/'.$defaultname; 改成 1 if($defaultname != 'index.html' || $cfg_typedir_df=='N' || $isdefault==0) $reurl

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Homework) D&A 5 Collection with Inheritance来讲解一些重要的排序与零散的知识.而且,本人以科学严谨的态度,对抽象类中析构函数的调用情况进行了分类讨论并一一试验,最终得出了"抽象类最好要定义纯虚析构函数"的结论,并不是凭空捏造,或者是从网上拷贝而来.但是,这仍然代表本人观点,不具有权威性,如有错误,欢迎大家批评指

排序算法----快速排序(链表形式)

单链表形式实现排序算法. 这个快速排序主要利用递归调用.包含4个文件,头文件QuickSort.h,fatal.h,库函数QuickSort.c,测试文件TestQuickSort. QuickSort.h 1 typedef long ElementType; 2 #ifndef _List_H//如果没有编译过 3 #include<stdbool.h> 4 struct Node; 5 typedef struct Node *PtrToNode; 6 typedef PtrToNode

编程题:实现一维数组初始化的几种形式。

#include<stdio.h> void main() { int n; int a[5]={0,1,2,3,4}; int b[5]={1,2}; float c[]={1,2,3,4,5}; for(n=0;n<5;n++) printf("%5d",a[n]); printf("\n"); for(n=0;n<5;n++) printf("%5d",b[n]); printf("\n"); f

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)

本文主要内容 1)介绍c++中双向链表的写法. 2)实现双向链表中数据的增.删.查.改.链表逆置.链表输出 3)介绍类中构造函数.析构函数.运算符重载函数的写法 接下来介绍双向链表的成员函数:这写函数放在头文件中,方便编写 #pragma once #include<iostream> using namespace std; #include<assert.h> typedef int DataType; class ListNode  //节点 { public: ListNo

基于数组实现的单链表(兼具Boost单元测试)

对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表).现在我们就来看看怎么用数组来实现单链表. 1. 定义单链表中结点的数据结构 1 typedef int ElementType; 2 class NodeType 3 { 4 public: 5 ElementType data; 6 int next; 7 }; 该结点包括了两个元素,其一是数据,另一个是指向下一个结点的"指针"(在这篇文章中实际上是指用于实现单链表的数组的下标.)  2. 定义一个的数组 1 co

假设用一个名为text的字符串向量存放文本文件的数据,其中的元素或者是一句话或者是一个用于表示段分隔的空字符串。将text中第一段全改为大写形式

#include<iostream> #include<string> #include<vector> using namespace std; int main() { vector<string> str={"The is C++ program ","hfh ","","hfdshfisoid"}; for(auto it=str.begin();it!=str.end(

将UIAlertView的按钮点击代理方式改为Block形式

   block类似C语言的函数指针,但Blocks不是一个指针,而是一个不带名字的函数(匿名的代码块).在这里我就不赘述了,说说将UIAlertView的按钮点击代理方式改为Block形式.代码中定义的全局变量_index与本文主要内容无关,在下一篇,我会详细说明Block的相互引用问题 //控制器ViewController.h文件   1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4

树状数组的改段求点,改段求段

改段求点(区间更新, 单点求值) 用一个数组 d 存储目标数组 a 中相邻元素的差值, 即 i > 1 时, d[i] = a[i] - a[i - 1] ; i == 1 时, d[i] = a[i] . 那么有 a[i] = d[1] + ... + d[i] .若要将 a 数组区间 [l, r] 的元素都加上 key, 显然只需令 d[l] += key, d[r + 1] -= key 即可. 显然只要用树状数组维护一下 d 数组即可. 改段求段(区间更新,区间求值) 与上面类似, 先开