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

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

相关文章

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

二叉树三种遍历方式及其实现

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶

剑指Offer—编程题15(链表中倒数第k个结点)

题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点. public static class ListNode {int value;ListNode next;} 解题思路:

算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码网106 岛屿的周长

卡码网110 字符串接龙 这题一开始用的邻接表+dfs,不幸超时 #include <iostream>#include <list>#include <string>#include <vector>using namespace std;int minLen = 501;bool count(string a, string b) {int num = 0;for (int i

red hat enterprise 下完全删除oracle 数据库

步骤 1     以 oracle 用户登录主、备节点。 步骤 2     关闭 数据库 监听。 > lsnrctl stop 步骤 3     关闭数据库 实例 。 > sqlplus '/as sysdba' > shutdown immediate 步骤 4     以root用户登录数据库 服务器 。 步骤 5     删除Oracle用户。 # userdel -r or

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学