二叉树

层次建树

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

typedef struct BiTNode {
    char data;
    struct BiTNode* lchild;
    struct BiTNode* rchild;
}BiTNode, * BiTree;

typedef struct tag {
    BiTree p;//树的某一个结点的地址值
    struct tag* next;
}tag_t, * ptag_t;

//前序遍历
void PreOrder(BiTree t) {
    if (t != NULL) {
        putchar(t->data);
        PreOrder(t->lchild);
        PreOrder(t->rchild);
    }
}
//中序遍历
void InOrder(BiTree t) {
    if (t != NULL) {
        InOrder(t->lchild);
        putchar(t->data);
        InOrder(t->rchild);
    }
}
//后序遍历
void PostOrder(BiTree t) {
    if (t != NULL) {
        PostOrder(t->lchild);
        PostOrder(t->rchild);
        putchar(t->data);
    }
}

//中序遍历非递归,非递归执行效率更高,考的概率很低
void InOrder2(BiTree T)
{
    SqStack S;
    InitStack(S); BiTree p = T;
    while (p || !StackEmpty(S))//逻辑或||
    {
        if (p)
        {
            Push(S, p);
            p = p->lchild;
        }
        else {
            Pop(S, p); putchar(p->c);
            p = p->rchild;
        }
    }
}
//层次遍历,广度优先遍历
void LevelOrder(BiTree T)
{
    LinkQueue Q;
    InitQueue(Q);
    BiTree p;
    EnQueue(Q, T);//树根入队
    while (!IsEmpty(Q))
    {
        DeQueue(Q, p);
        putchar(p->c);
        if (p->lchild != NULL)
            EnQueue(Q, p->lchild);
        if (p->rchild != NULL)
            EnQueue(Q, p->rchild);
    }
}
int main() {
    //树的结点
    BiTree pnew;
    //树根
    BiTree Tree = NULL;

    ptag_t front,cur = NULL;
    ptag_t rear = NULL;
    char d;
    while (scanf("%c",&d)!=EOF) {
        if (d == '\n') {
            break;
        }
        //生成新的节点
        pnew = (BiTree)malloc(sizeof(BiTNode));
        pnew->data = d;
        pnew->lchild = NULL;
        pnew->rchild = NULL;
        //队列生成新的节点
        ptag_t tnew = (ptag_t)malloc(sizeof(tag));
        tnew->p = pnew;
        if (Tree == NULL) {
            Tree = pnew;
            front = tnew;
            rear = tnew;
            cur = tnew;
            continue;
        }
        else {
            rear->next = tnew;
            rear = tnew;
        }
        if (cur->p->lchild == NULL) {
            cur->p->lchild = pnew;
        }
        else if (cur->p->rchild == NULL) {
            cur->p->rchild = pnew;
            cur = cur->next;
        }

    }
    printf("前序遍历\n");
    PreOrder(Tree);
    printf("\n");
    printf("中序遍历\n");
    InOrder(Tree);
    printf("\n");
    printf("后序遍历\n");
    PostOrder(Tree);
    
    return 0;
}

二叉排序树的操作

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

typedef struct BiTNode {
    int data;
    struct BiTNode* lchild;
    struct BiTNode* rchild;
}BiTNode,* BiTree;

int BST_Insert(BiTree& T,int d) {
    //将节点初始化
    if (T == NULL) {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = d;
        T->lchild = NULL;
        T->rchild = NULL;
        return 1;
    }else if (d == T->data) {
        return 0;
    }else if (d < T->data) {
        return BST_Insert(T->lchild, d);
    }else {
        return BST_Insert(T->rchild, d);
    }
    
}

void Creat_BST(BiTree& T, int str[], int n) {
    T = NULL;
    int i = 0;
    while (i < n) {
        BST_Insert(T, str[i]);
        i++;
    }
}

//查找节点
BiTree BST_Search(BiTree T,int n, BiTree& P) {
    //父节点
    P = NULL;
    while (T != NULL && T->data != n) {
        P = T;
        if (n > T->data) {
            T = T->rchild;
        }else if(n<T->data){
            T = T->lchild;
        }
    }
    return T;
}

//删除节点
void DeleteNode(BiTree& root, KeyType x) {
    if (root == NULL) {
        return;
    }
    if (root->key > x) {
        DeleteNode(root->lchild, x);
    }
    else if (root->key < x) {
        DeleteNode(root->rchild, x);
    }
    else { //查找到了删除节点
        if (root->lchild == NULL) { //左子树为空
            BiTree tempNode = root;
            root = root->rchild;
            free(tempNode);
        }
        else if (root->rchild == NULL) { //右子树为空
            BiTree tempNode = root;//临时指针
            root = root->lchild;
            free(tempNode);
        }
        else {  //左右子树都不为空
            //一般的删除策略是左子树的最大数据 或 右子树的最小数据 代替要删除的节点(这里采用查找左子树最大数据来代替)
            BiTree tempNode = root->lchild;
            if (tempNode->rchild != NULL) {
                tempNode = tempNode->rchild;
            }
            root->key = tempNode->key;
            DeleteNode(root->lchild, tempNode->key);
        }
    }
}
void PreOrder1(BiTree T) {
    if (T != NULL) {
        printf("%3d", T->data);
        PreOrder1(T->lchild);
        PreOrder1(T->rchild);
    }
}
int main() {
    BiTree T = NULL;
    BiTree Search;
    int a[] = { 1,4,5,7,3,6,2 };
    Creat_BST(T, a, 7);
    PreOrder1(T);
    BST_Search(T, 7, Search);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容