按层逆遍历一棵树,使用满二叉树存储

机试题:
用C语言编写控制台程序。
使用二叉树按层逆遍历输出树的每一个元素。(即从最底层 往 上输出 直到根节点)
要求: 
1,自定义数据结构。使用满二叉树存储输入数据。
2,input: 0,1,2,3,4,5,6,7
   output:7,3,4,5,6,1,2 ,0

 分析:假如树的节点数目为num,则树高为:log(num)/log(2)+1,换底公司,log得到以2为底的log函数,其次int类型会自动截断,只保留整数

                其次,假定根节点为第1层,则第i层的节点编号为:pow(2,i-1)~pow(2,i)-1.

              因此,只需要从最底层依次往上面遍历就可以了。

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4
 5
 6 int main()//按层逆遍历一棵树,树使用满二叉树存储,直接用数组就好了
 7 {
 8     int num;
 9     cout << "please input the number of nodes:" << endl;
10     cin >> num;
11     int treeArray[200];
12     memset(treeArray, 0, 200 * sizeof(treeArray[0]));
13     cout << "input the key of each node:" << endl;
14     for (int i = 1; i <= num; i++)
15     {
16         cin >> treeArray[i];
17     }
18     int level = log(num) / log(2) + 1;
19     for (int j = level; j > 0;j--)
20     for (int k = pow(2, j - 1); k <= pow(2, j) - 1; k++)
21     {
22         if (k<=num)
23         cout << treeArray[k] << "   ";
24     }
25
26     return 0;
27 }
时间: 2024-12-20 00:58:08

按层逆遍历一棵树,使用满二叉树存储的相关文章

如何将一棵树转化成二叉树

要点: 从这棵树的根结点开始,从上到下,看每一个结点,把你正在看的结点的孩子放在左子树,兄弟放在右子树. 口诀: 1. 将 节点的孩子 放在左子树: 2. 将 节点的兄弟 放在右子树. 关于这个问题,最好的办法就是记住一道例题了,因为语言不是很好描述,也不容易看懂描述. 例题: 或者有另一种理解方法: 步骤: 1.在所有兄弟结点之间加一连线 2.对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线. 如下图所示: ————————————————版权声明:本文为CSDN博主「猫萌萌」

判断一棵二叉树是否为BST,一棵树是否为完全二叉树

对于一颗搜索二叉树,最简单的方法就是用中序遍历,看是不是一个递增数列,如果是则是一颗搜索二叉树,如果不是则不是搜索二叉树.在这里用一个lastVisit去记录上一次搜索到的节点.整个过程就是先找到最左下角的节点,更新这个lastVisit为这个节点的值,然后按照中序遍历依次更新即可.代码如下. 1 #include <stdio.h> 2 #include <climits> 3 4 //二叉树结点 5 typedef struct binary_tree_node_t{ 6 bi

判断一棵树是否为完全二叉树

完全二叉树:若一棵二叉树具有具有n个节点,它的每个节点都与高度为k的满二叉树编号为0~n-1结点一一对应,则称这可二叉树为完全二叉树. 方法一:一维数组存储 根据完全二叉树的定义和性质,利用一位数组作为完全二叉树的存储,如下图 由图,节点的编号与数组元素的下标是一一对应的,可根据二叉树的性质,可方便找出下标 为i的的双亲结点a[i/2]及左右孩子结点a[i*2],a[i*2+1].这样判断一棵树是否为二叉树,应该对此二叉树从上到下,从左到右依次编号, 然后把编好的号依次存入一位数组中,在与相应深

LeetCode:Binary Tree Paths - 获取一棵树从顶点到每个叶节点的路径

1.题目名称 Binary Tree Paths(获取一棵树从顶点到每个叶节点的路径) 2.题目地址 https://leetcode.com/problems/binary-tree-paths/ 3.题目内容 英文:Given a binary tree, return all root-to-leaf paths. 中文:给定一颗二叉树,返回所有的根节点到叶节点的路径 例如:现有一颗二叉树    1  /   2     3    5 所有由根节点到叶节点的路径如下: ["1->2-

LeetCode&mdash;&mdash;Same Tree(判断两棵树是否相同)

问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value.   分析: 考虑使用深度优先遍历的方法,同时遍历两棵树,遇到不等的就返回. 代码如下: /** * Definition f

树、二叉树、满二叉树、完全二叉树

自由树 自由树是一个连通的,无回路的无向图. 令G=(V,E)为一个无向图.下面的表述是等价的. 1)        G是自由树. 2)        G中任意两个顶点由唯一一条简单路径得到. 3)        G是连通的,但从E中去掉任何边后得到的图都是非连通的. 4)        G是无回路的,且|E|=|V|-1. 5)        G是连通的,且|E|=|V|-1. 6)        G是无回路的,但添加任何边到E中得到的图包含回路. 二叉树 在计算机科学中,二叉树是每个节点最多

637. Average of Levels in Binary Tree(一棵树每层节点的平均数)(二叉树的层序遍历)

Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array. Example 1: Input: 3 / 9 20 / 15 7 Output: [3, 14.5, 11] Explanation: The average value of nodes on level 0 is 3, on level 1 is 14.5, and on le

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

树与森林的存储、遍历和树与森林的转换

树的存储结构 双亲表示法 孩子表示法: (a)多重链表(链表中每个指针指向一棵子树的根结点); (b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表. 孩子兄弟表示法://二叉树表示法或二叉链表表示法 以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling) //孩子兄弟表示法 typedef struct CSNode{ int data; CSNode *fchild