首页 > 其他分享 >319将满二叉树转化为求和树

319将满二叉树转化为求和树

时间:2023-12-23 12:44:24浏览次数:39  
标签:lchild 319 求和 sum int 二叉树 rchild

题目: 将满二叉树转换为求和树

问题描述

给出满二叉树,编写算法将其转化为求和树

求和树:二叉树的求和树,是一颗同样结构的二叉树,其树中的每个结点将包含原始树中的左子树和右子树的和。

二叉树:

10

/     \

-2       6

/    \    /  \

8      -4  7    5

 

求和树:

20(4-2+12+6)

/      \

4(8-4)     12(7+5)

/   \      /   \

0      0    0    0

二叉树给出先序和中序遍历序列,求和树要求输出中序遍历序列;

所有处理数据不会大于int类型范围。

输入格式

输入共3行:第一行为满二叉树中结点个数n(n<1024);第二行为n个整数,表示二叉树的先序遍历序列;第三行也有n个整数,表示二叉树的中序遍历序列。整数间以空格分割。

输出格式

输出1行整数,表示求和树的中序遍历序列。整数间以空格分割。

样例输入

    7

10 -2 8 -4 6 7 5

8 -2 -4 10 7 6 5

样例输出

0 4 0 20 0 12 0

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 typedef struct treenode{
 5     int data;
 6     struct treenode *lchild;
 7     struct treenode *rchild;
 8     int sum=0;
 9 }treenode,*tree;
10 
11 tree createTree(int *preorder,int *inorder,int n);
12 void postorderTraverse(tree t);
13 void sumarize(tree t);
14 int main()
15 {
16     int n;//the number of the vertex
17     scanf("%d",&n);
18     
19     int preorder[1024],inorder[1024];
20     int i,j,k;
21     for(i=0;i<n;i++)
22     {
23         scanf("%d",&preorder[i]);
24     }
25     for(j=0;j<n;j++)
26     {
27         scanf("%d",&inorder[j]);
28     }
29     
30     tree t,sumt;
31     t=createTree(preorder,inorder,n);
32     sumarize(t);
33     postorderTraverse(t);
34     return 0;
35 }
36 tree createTree(int *pre,int *in,int n)
37 {
38     int k;
39     int *p;
40     if(n<=0) return NULL;
41     
42     treenode *b=(treenode*)malloc(sizeof(treenode));
43     b->data=*pre;
44     for(p=in;p<in+n;p++)
45     {
46         if(*p==*pre) break;
47     }
48     
49     k=p-in;
50     b->lchild=createTree(pre+1,in,k);
51     b->rchild=createTree(pre+k+1,p+1,n-k-1);
52     return b;
53     
54 }
55 void postorderTraverse(tree t)
56 {
57     /*if(!t) printf("EMPTY\n");
58     else
59     {
60         postorderTraverse(t->lchild);
61         postorderTraverse(t->rchild);
62         printf("%d ", t->data);
63     }*/
64     if(t)
65     {
66         postorderTraverse(t->lchild);
67         printf("%d ", t->sum);
68         postorderTraverse(t->rchild);
69         
70     }
71 }
72 void sumarize(tree t)
73 {
74     if(t->lchild&&t->rchild) 
75     {
76         if(t->rchild) sumarize(t->rchild);
77         if(t->lchild) sumarize(t->lchild);
78         t->sum=t->lchild->data+t->rchild->data+
79                      t->lchild->sum+t->rchild->sum;
80     }
81     else t->sum=0;
82 }

core:

给treenode增加一个sum域;

再就是求和函数注意题目要求

标签:lchild,319,求和,sum,int,二叉树,rchild
From: https://www.cnblogs.com/xzdmzrc221202/p/17922963.html

相关文章

  • 318二叉树遍历
    1#include<stdio.h>2#include<string.h>3#include<stdlib.h>4typedefstructtreenode{5chardata;6structtreenode*lchild;7structtreenode*rchild;8}treenode,*tree;910treecreateTree(char*preorder,char......
  • 317输出完全二叉树的某一层
    题目:输出完全二叉树的某一层问题描述对一棵完全二叉树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。输入格式       输入有多组数据。每组数据第一行输入一个结点数n(1<=n<=1000),第二行将树中的这n个节点依次输入(每个结点存储的数据是一个数字),n个结点编号......
  • 316完全二叉树的公共父结点
    题目:完全二叉树的公共父结点问题描述有一棵无限大的完全二叉树,该二叉树自上而下、自左而右从1开始编号。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从5到根结点的路径是(5,2,1),从4到根结点的路径是(4,2,1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1......
  • 315二叉树扩展先序遍历转中序遍历
    题目:二叉树扩展先序遍历转中序遍历问题描述编一个程序,读入用户输入的一串扩展先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的扩展先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出......
  • 314完全二叉树的子树
    题目:完全二叉树的子树问题描述对一棵完全二叉树,采用自上而下、自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点?输入格式       输入数据包括多行,每行给出一组测试数据,包括两个整数m,n(1<=m<=n<=10......
  • 23_合并二叉树
    617.合并二叉树给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null的节点将......
  • 199. 二叉树的右视图(中)
    目录题目题解:BFS题目给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。题解:BFS用BFS,每一层最后一个弹出队列的元素加到结果列表里面classSolution:defrightSideView(self,root:Optional[TreeNode])->Lis......
  • 107. 二叉树的层序遍历 II(中)
    目录题目题解:BFS题目给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)题解:BFS用BFS把每层的结点存在一个单独的列表里,最后翻转整个结果列表classSolution:deflevelOrderBottom(self,root:Op......
  • 103. 二叉树的锯齿形层序遍历(中)
    目录题目题解:BFS题目给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。题解:BFS用BFS把每一层的结点存在一个列表里面,然后判断一下如果是偶数层就翻转列表,最后都加入结果列表返回即可classSo......
  • 二叉树
    一.二叉树的概念1.二叉树的性质二叉树的每个节点最多有两个子节点,分别称为左孩子和右孩子,以他们为根的子树称为左子树和右子树。二叉树的第i层最多有2^(i-1)个节点。如果每层的节点数都是满的,称他为满二叉树。图例:如果这个二叉树只是在最后一层有缺失,且......