数据结构专题二:二叉树_1

以下都是树,由于一条边连接两个顶点,切树中没有环,因此对有n结点的树,边数一定是n-1。且满足连通,边数等于顶点数减一的结构一定是一颗树。

数据结构专题二:二叉树_1_第1张图片

二叉树:二叉树要么没有根结点,是一棵空树;要么由根结点,左子树右子树构成,且左子树和右子树都是二叉树。简而言之,二叉树每个节点最多有2两个子节点数据结构专题二:二叉树_1_第2张图片

满二叉树:每一层的结点个数都达到了当层所能达到的最大结点数,如E

完全二叉树:除了最下面一层外,其余层的结点个数都达到了最大结点数,且最下面一层的结点都靠左。 

struct node{
    int data;
    node * lchild;
    node * rchild;
};

//1、创建一个新的节点
node * newNode(int v){
    node * Node = new node;  
    Node->data = v;
    Node->lchild = Node->rchild =NULL;
    return Node;
}

//2、查找所有数据域x的结点并修改为newdata
void search(node * root, int x, int newdata){
    if(root == NULL)
    {
        return;
    }
    if(root->data == x){ root->data = newdata;}
    search(root->lchild, x ,newdata);
    search(root->rchild, x ,newdata);
}

//3、创建一个二叉树
node * Create(int data[], int n)
{
    node * root =NULL;
    for(int i = 0; i< n; i++){
        insert(root,data[i]);
    }
    return root;  
}

//4、二叉树的插入,这里的写法不好
void insert(node *  &node, int x){
    if(root == NULL){
        root = newNode(x); //这里对node进行操作,所以要使用&
        return ;
    }
    if(x应该插在左子树){
        insert(root->lchild,x);
    }else{
        insert(root->rchild,x);
    }
}

 二叉树的遍历:有四种

先序遍历:根结点->左子树->右子树,遍历结果为ABDECF,体现深度优先的思想

数据结构专题二:二叉树_1_第3张图片 

void preorder(node * root){
    if(root == NULL)
    {
        return ;
    }
    printf("%d\n", root->data);

    preorder(root->lchild); //访问左子树
    preorder(root->rchild); //访问右子树
}

中序遍历:先左子树,再根结点,最后右子树,DBEACF

后序遍历:先左子树,再右子树,最后根结点 DEBFCA

层序遍历:从根结点往下逐层遍历,每一层都是从左往右进行遍历 ABCDEF,体现广度优先的思想

void LayerOrder(node * root){
    queue q;
    q.push(root);
    while(!q.empty()){
        node * now = q.front(); //取出队首元素
        q.pop();
        printf("%d/n",now->data);
        if(now->lchild != NULL) q.push(now->lchild); //左子树飞空
        if(now->rchild != NULL) q.push(now->rchild); //右子树飞空
    
    }
}

 

你可能感兴趣的:(数据结构篇)