完全二叉树指向同一层的相邻结点

2024-05-29 11:08

本文主要是介绍完全二叉树指向同一层的相邻结点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。

答:时间复杂度为O(n),空间复杂度为O(1)。

复制代码
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>using namespace std;struct TreeNode 
{int m_nValue;TreeNode *m_pLeft;TreeNode *m_pRight;TreeNode *pNext;
};//假定所创建的二叉树如下图所示
/*1/     \2       3/ \      / \4   5    6   7/ \  / \  / \8   9 10 11 12 13
*/
void CreateBitree(TreeNode *&pNode, fstream &fin)
{int dat;fin>>dat;if(dat == 0){pNode = NULL;}else {pNode = new TreeNode();pNode->m_nValue = dat;pNode->m_pLeft = NULL;pNode->m_pRight = NULL;pNode->pNext = NULL;CreateBitree(pNode->m_pLeft, fin);      CreateBitree(pNode->m_pRight, fin); }
}//完全二叉树指向同一层的相邻结点
void Solution(TreeNode *pHead)
{if (NULL == pHead){return;}vector<TreeNode*> vec;vec.push_back(pHead);TreeNode *pre = NULL;TreeNode *pNode = NULL;int cur = 0;int last = 0;while(cur < vec.size()){last = vec.size();while (cur < last){if (NULL == pre){pre = vec[cur];}else{pre->pNext = vec[cur];}if (NULL != vec[cur]->m_pLeft){vec.push_back(vec[cur]->m_pLeft);}if (NULL != vec[cur]->m_pRight){vec.push_back(vec[cur]->m_pRight);}pre = vec[cur];cur++;}pre->pNext = NULL;pre = NULL;}
}int _tmain(int argc, _TCHAR* argv[])
{fstream fin("tree.txt");TreeNode *pHead = NULL;TreeNode *pNode = NULL;CreateBitree(pHead, fin);Solution(pHead);while (NULL != pHead){cout<<pHead->m_nValue<<"  ";pNode = pHead->pNext;while (NULL != pNode){cout<<pNode->m_nValue<<"  ";pNode = pNode->pNext;}cout<<endl;pHead = pHead->m_pLeft;}cout<<endl;return 0;
}

这篇关于完全二叉树指向同一层的相邻结点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013497

相关文章

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

uva674(完全背包)

题意: 有5种硬币1,5,10,25,50,;现在随意的给出一个价钱,问你有几种组合方式! 输入11 输出4 1+...+1(10个),5+(6*1),5+5+1,  10+1(共4种) 思路; 满足完全背包思想,状态转移方程:dp[i+num[k]] += dp[i](dp[i]为组合成i的不重复种数,num[k]分别为1,5,10,25,50)不能合在一起转移,否则会导致重复!

【hdu】I Hate It(线段树,结点修改求区间最大值)

线段树的模板题,还是二分递归。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <set>#include <map>#incl