二叉树采用二叉链表存储,复制二叉树的算法(树的应用)

本文介绍了一种使用二叉链表存储的二叉树复制算法,并提供了完整的C语言实现代码。通过递归方式实现了二叉树节点的复制,确保了新旧树结构的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树采用二叉链表存储,试写出复制一棵二叉树的算法。

话不多说上代码:

#include<stdio.h>

#include<stdlib.h>

typedef struct BiTnode  

{  

        int data;  

        struct BiTnode* Lchild,*Rchild;   

}BiTnode,*BiTree;  

  

void create(BiTree &S)  

{  

        char ch;  

        char temp;  

        scanf("%c",&ch);  

        temp=getchar();  

        if(ch=='#')  

        {  

                S=NULL;  

        }  

        else  

        {  

                S=(BiTree)malloc(sizeof(BiTnode) );  

                if(!S)  

                {  

                    exit(0);  

                }  

                else  

                {  

                        S->data=ch;  

                         

                        create(S->Lchild);  

                        

                        create(S->Rchild);  

                }  

  

        }  

        return;  

  

}

 void Traverse(BiTree T)  

{  

        if(NULL==T)  

        {  

                return;  

        }  

        else  

        {  

            printf("%c ",T->data);  

            Traverse(T->Lchild);  

            Traverse(T->Rchild);  

        }  

  

}  

  

 

void CopyTree(BiTree S,BiTree &T){

BiTree lptr,rptr;

    if (!S) T=NULL;

    else{

        CopyTree(S->Lchild,lptr);        CopyTree(S->Rchild,rptr);  

          

            T=(BiTree)malloc(sizeof(BiTnode) );

        T->data=S->data;

        T->Lchild=lptr;T->Rchild=rptr;

    }

}

int main()

{  

     BiTree T;BiTree S;

 printf("创建一个树\n");        

     create(S);

     printf("遍历该树\n");

 Traverse(S);     

     printf("\n");

     printf("拷贝该树\n");

     CopyTree(S,T);

     Traverse(T);

     return 0;

 } 

二叉链表存储结构中,二叉树的每个节点由一个数据域和两个分别指向左右子的指针域组成。叶子节点是指没有子节点的节点。统计二叉树中叶子节点的数量可以通过递归遍历的方式实现。下面是一个统计叶子节点数量的算法示例: ```python class TreeNode: def __init__(self, value=0, left=None, right=None): self.val = value self.left = left self.right = right def countLeaves(node): # 如果当前节点为空,返回叶子节点数为0 if node is None: return 0 # 如果当前节点是叶子节点,返回叶子节点数为1 if node.left is None and node.right is None: return 1 # 否则,递归计算左右子的叶子节点数量,并返回它们的和 return countLeaves(node.left) + countLeaves(node.right) # 示例使用: # 创建一个二叉树的节点 # 1 # / \ # 2 3 # / / \ # 4 5 6 # / # 7 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.right.left = TreeNode(5) root.right.right = TreeNode(6) root.left.left.left = TreeNode(7) # 统计叶子节点数量 leaf_count = countLeaves(root) print("叶子节点的数量是:", leaf_count) ``` 在这个示例中,`countLeaves` 函数递归地遍历二叉树的每个节点,并统计叶子节点的数量。如果当前节点为空,则返回0,表示没有找到叶子节点;如果当前节点没有子节点,则返回1,表示找到了一个叶子节点;如果当前节点有子节点,则递归地对其左右子调用 `countLeaves` 函数,并将结果相加,最后返回叶子节点的总数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值