数据结构例程——从根节点到每个叶子节点的路径之逆

简介: 本文是数据结构基础系列(6):树和二叉树中第11课时二叉树遍历非递归算法和第12课时层次遍历算法的例程。问题:设计算法输出从根节点到每个叶子节点的路径之逆。 解法1:利用二叉树后序遍历非递归算法中,每一个叶子节点出现时,栈中从栈顶到栈底,正好是叶子节点到根节点的逆序的性质编写。[参考解答](btreee.h见算法库)#include <stdio.h&

本文是数据结构基础系列(6):树和二叉树中第11课时二叉树遍历非递归算法和第12课时层次遍历算法的例程。

问题:设计算法输出从根节点到每个叶子节点的路径之逆。
解法1:利用二叉树后序遍历非递归算法中,每一个叶子节点出现时,栈中从栈顶到栈底,正好是叶子节点到根节点的逆序的性质编写。

[参考解答](btreee.h见算法库

#include <stdio.h>
#include "btree.h"

void AllPath1(BTNode *b)
{
    BTNode *St[MaxSize];
    BTNode *p;
    int flag,i,top=-1;  //栈指针置初值
    if (b!=NULL)
    {
        do
        {
            while (b!=NULL) //将*b的所有左节点进栈
            {
                top++;
                St[top]=b;
                b=b->lchild;
            }
            p=NULL;
            flag=1;
            while (top!=-1 && flag)
            {
                b=St[top];       //取出当前的栈顶元素
                if (b->rchild==p)
                {
                    if (b->lchild==NULL && b->rchild==NULL)
                    {
                        //若为叶子节点,输出栈中所有节点值
                        for (i=top; i>0; i--)
                            printf("%c->",St[i]->data);
                        printf("%c\n",St[0]->data);
                    }
                    top--;
                    p=b;            //p指向刚访问过的节点
                }
                else
                {
                    b=b->rchild;          //b指向右孩子节点
                    flag=0;
                }
            }
        }
        while (top!=-1);
        printf("\n");
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b: ");
    DispBTNode(b);
    printf("\n");
    printf("从根节点到每个叶子节点的路径之逆:\n");
    AllPath1(b);
    DestroyBTNode(b);
    return 0;
}

解法2:利用二叉树层次遍历算法的思路解决。

  • 采用非环形顺序队列qu
  • 层次遍历二叉树
  • 将所有已访问过的节点指针进队,并在队列中保存双亲节点的位置。
  • 当找到一个叶子节点时,在队列中通过双亲节点的位置输出根节点到该叶子节点的路径之逆。

[参考解答](btreee.h见算法库

#include <stdio.h>
#include "btree.h"

void AllPath2(BTNode *b)
{
    struct snode
    {
        BTNode *node;   //存放当前节点指针
        int parent;     //存放双亲节点在队列中的位置
    } qu[MaxSize];      //定义非环形队列
    BTNode *q;
    int front,rear,p;   //定义队头和队尾指针
    front=rear=-1;      //置队列为空队列
    rear++;
    qu[rear].node=b;    //根节点指针进入队列
    qu[rear].parent=-1; //根节点没有双亲节点
    while (front!=rear) //队列不为空
    {
        front++;        //front是当前节点*q在qu中的位置
        q=qu[front].node;   //队头出队列,该节点指针仍在qu中
        if (q->lchild==NULL && q->rchild==NULL)
        {
            p=front;        //输出*q到根节点的路径序列
            while (qu[p].parent!=-1)
            {
                printf("%c->",qu[p].node->data);
                p=qu[p].parent;
            }
            printf("%c\n",qu[p].node->data);
        }
        if (q->lchild!=NULL)    //*q节点有左孩子时将其进列
        {
            rear++;
            qu[rear].node=q->lchild;
            qu[rear].parent=front; //*q的双亲位置为front
        }
        if (q->rchild!=NULL)       //*q节点有右孩子时将其进列
        {
            rear++;
            qu[rear].node=q->rchild;
            qu[rear].parent=front; //*q的双亲位置为front
        }
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b: ");
    DispBTNode(b);
    printf("\n");
    printf("从根节点到每个叶子节点的路径之逆:\n");
    AllPath2(b);
    DestroyBTNode(b);
    return 0;
}

注:在main函数中,创建的用于测试的二叉树如下——
这里写图片描述

目录
相关文章
|
4月前
|
存储 算法 程序员
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
43 0
|
8月前
|
算法
|
4月前
|
存储
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
223 0
|
6月前
|
算法 DataX C语言
【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法【下】
六、二叉树叶子节点个数 1.代码: 2.测试结果: 七、二叉树第k层节点个数 1.代码: 2.测试结果: 八、二叉树查找值为x的节点 1.代码: 2.测试结果: 九、判断二叉树是否是完全二叉树 1.代码: 2.测试结果: 十、补充:队列代码 Queue.h Queue.c
|
6月前
|
算法 C语言
【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法【上】
文章目录 一、二叉数的结构体 二、构建二叉树,供后续测试使用 三、二叉树销毁 四、构建节点 五、二叉树的高度: 1.代码: 2.测试结果: 二叉树节点个数 1.代码: 2.测试结果:
|
4月前
【数据结构】双向链表中删除节点的方法实现(代码+详解)
【数据结构】双向链表中删除节点的方法实现(代码+详解)
73 0
|
4月前
|
存储
链表加法与节点交换:数据结构的基础技能
链表加法与节点交换:数据结构的基础技能
|
4月前
|
存储
数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)
数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)
251 0
|
4月前
数据结构单链表之交换链表中的节点而不交换数据 | 第八套
数据结构单链表之交换链表中的节点而不交换数据 | 第八套
26 0
|
4月前
数据结构单链表之删除给定位置的链表节点 | 第五套
数据结构单链表之删除给定位置的链表节点 | 第五套
38 0

热门文章

最新文章