IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法笔记--二叉树相应的算法题 -> 正文阅读

[数据结构与算法]算法笔记--二叉树相应的算法题

算法笔记–二叉树相应的算法题

1.二叉树自下而上、从右到左的层次遍历算法

void InvertLevel(BiTree T){
    Stack s;
    Queue q;
    if(bt){
        InitStack(s);
        InitQueue(q);
        EnQueue(q,T);
        while(!IsEmpty(q)){
            DeQueue(q,p);
            push(s,p); //出队时将元素入栈
            if(p->lchild)
                EnQueue(q,p->lchild);
            if(p->rchild)
                EnQueue(q,p->rchild);
        }
        while(!IsEmpty(s)){ //最后将栈遍历,则得到反向层次遍历的结果
            pop(s,p);
            visit(p->data);
        }
    }
}

2.设计非递归算法求链表存储的二叉树高度

int GetHeight(BiTree T){ //非递归算法
    if(!T) return 0;
    int front=-1,rear=-1;
    int last=0,level=0; //last指向当前层的最右节点,level记录当前层数
    BiTree q[MaxSize];
    q[++rear]=T;
    BiTree p; //操作指针
    while(front<rear){
        p=q[++front];
        //层次遍历
        if(p->lchild)
            q[++rear]=p->lchild;
        if(p->rchild)
            q[++rear]=p->rchild;
        if(front==last){ //若当前指针与当前层最右节点相等。则层数+1,last指向下一层最右节点
            level++;
            last=rear;
        }
    }
    return level;
}

//递归算法如下
int GetHeight2(BiTree T){
    if(!T) return 0;
    lheight=GetHeight2(T->lchild);
    rheight=GetHeight2(T->rchild);
    if(lheight<rheight) return riheight+1;
    else lheight+1;
}

3.一颗节点各不相同的二叉树,先序和中序遍历的序列分别存在两个一维数组A[1…n]和B[1…n]中,建立该二叉树链表

BiTree createBiTree(ElemType A[],ElemType B[],int l1,int h1,int l2,int h2){
    //l1,h1为先序的第一个和最后一个节点下标
    //l2,h2为中序的第一个和最后一个节点下标
    root=(BiTNode*)malloc(sizeof(BiTNode));
    root->data=A[l1];
    for(i=l2;B[i]!=root;i++);
    llen=i-l2; //左子树长度
    rlen=h2-i;//右子树长度
    if(llen) //递归建立左子树
        root->lchild=createBiTree(A,B,l1+1,l1+llen,l2,l2+llen-1);
    else root->lchild=null;
    if(rlen) //递归建立右子树
        root->rchild=createBiTree(A,B,l1+llen,h1,l2+llen,h2);
    else root->rchild=null;
    return root;
}

4.二叉树按链表存储,判断给定二叉树是否一个完全二叉树

bool CheckCompleteBT(BiTree T){
    queue<BitNode> q; //建立队列
    if(!T) return true;
    q.push(T);
    while(!q.empty()){ //层次遍历
        auto p=q.front();
        q.pop();
        if(p){ //若某节点不为空,则将其左右儿子一次入队
            q.push(p->lchild);
            q.push(p->rchild)
        }else{ //若某节点为空
            while(!q.empty()){ //则判断队列中剩下节点是否有不为空的节点
                p=q.front();
                q.pop();
                if(p) return false; //若有,则不是完全二叉树
            }
        }
    }
    return true; //否则是完全二叉树
}

5.二叉树采用二叉链表存储,计算给定一颗二叉树的所有双分支节点个数

计 算 一 颗 二 叉 树 b 中 所 有 双 分 支 节 点 个 数 的 递 归 模 型 如 下 : f ( b ) = 0 , b = n u l l f ( b ) = f ( b ? > l c h i l d ) + f ( b ? > r c h i l d ) + 1 , b 为 双 分 支 节 点 f ( b ) = f ( b ? > l c h i l d ) + f ( b ? > r c h i l d ) , b 为 单 分 之 节 点 o r 叶 子 节 点 计算一颗二叉树b中所有双分支节点个数的递归模型如下:\\ f(b)=0,b=null\\ f(b)=f(b->lchild)+f(b->rchild)+1,b为双分支节点\\ f(b)=f(b->lchild)+f(b->rchild),b为单分之节点or叶子节点 bf(b)=0,b=nullf(b)=f(b?>lchild)+f(b?>rchild)+1,bf(b)=f(b?>lchild)+f(b?>rchild),bor

int computeDNode1(BiTree T){ //采用递归方法
   	if(!T) return 0;
    else if(T->lchild&&T->rchild) 
        return computeDNode(T->lchild)+computeDNode(T->rchild)+1;
    else
        return computeDNode(T->lchild)+computeDNode(T->rchild);
}

int computeDNode2(BiTree T){ //非递归方法
    queue<BitNode> q;
    int num=0; //用来计数
    q.push(T);
    while(!q.empty()){ //层次遍历二叉树
       	auto p=q.front();
        q.pop();
        if(p->lcihld&&p->rchild) //若当前节点有左右儿子,则计数器+1
            num++;
        q.push(p->lchild);
        q.push(p->rchild);
    }
    return num;
}

6.若树B是链式存储的二叉树,设计一个把树B中所有节点的左、右子树进行交换的函数

void swap(BiTree T){ //递归
    if(T){
        swap(b->lchild); //递归交换左子树
        swap(b->rchild); //递归交换右子树
        auto temp=T->lchild; //交换左右孩子节点
        T->lchlid=T->rchild;
        T->rchild=temp;
    }
}

7.二叉树采用链表存储,求先序遍历序列中第k个节点的值(1<=k<=n)

int i=1;//全局变量,记录当前所访问的是第几个节点
ElemType getIndex(BiTree T,int k){
    if(!T) return null; //节点为空返回null
    if(i==k) return T->data; //如果当前节点是第k个节点,则返回data
    i++;
    auto val=getIndex(T->lchild,k); //遍历左子树
    if(val!=null) { //如果左子树中已经遍历到第k个节点了则直接返回
        i=1; //重置全局变量,方便下次使用
        return val;
    }
    val=getiIndex(T->rchild,k);//否则遍历右子树,直到找到第k个节点
    i=1; //重置全局变量,方便下次使用
    return val;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:13:18  更:2022-07-04 23:17:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:49:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码