将二叉树按照螺旋顺序分层连接
来源:互联网 发布:阿里云怎么解析域名 编辑:程序博客网 时间:2024/04/30 01:57
Write a program to convert binary tree in to doubly linked list such that doubly linked list represents the spiral order of given tree using recursion, Inplace(no Extra Space except recursion memory stack)
given pointer to head of binary tree
1
/ \
2 3
/ \ / \
4 5 6 7
doubly linked list represent
head-> 1 2 3 7 6 5 4
最后的两个算法都是有错误的,以现在的两个算法为准:
如果使用额外空间,倒第二个算法,也是错误的,放入vec的顺序和从vec读取的顺序的周期有问题,不能螺旋打印。可以这样做,在连接每一层之前,先从左到右把节点的left和right放入vec中,然后在根据flag是从左到右还是从右到左把节点从vec中取出并用双链表连接,每一层flag取反:
struct node{ int val; node *left; node *right; };void append(node* &head, vector<node*>&vec, int beg, int end, bool flag ) { if (flag) { for (int i = beg; i <= end; ++i) { node* n = vec[i]; n->right = NULL; head->right = n; n->left = head; head = n; } } else { for (int i = end; i >= beg; --i) { node* n = vec[i]; n->right = NULL; head->right = n; n->left = head; head = n; } }}void push(vector<node*>& vec, int beg, int end) { for (int i = beg; i <= end; ++i) { node *n = vec[i]; if (n->left) vec.push_back(n->left); if (n->right) vec.push_back(n->right); }}node* bitree2dlink(node *root) { if (!root) return NULL; vector<node*> vec; int beg = 0; int end = 0; vec.push_back(root); node head; head->left = NULL; head->right = NULL; node *pt = &head; bool flag = false; while(vec.size() > 0) { push(vec, beg, end); append(pt, beg, end, flag); flag = !flag; beg = end + 1; end = vec.size() - 1; } return pt->right;}
int height(node* root) { if (root == NULL) return 0; return max(height(root->left)+1, height(root->right) + 1);}void tree2link(node*pt, node* n, int level, bool flag) { if (n == NULL) return; if (level == 0) { n->right = pt->right; if (pt->right) pt->right->left = n; pt->right = n; n->left = pt; } if (level > 0) { if (flag) { tree2link(pt, n->left, level - 1, flag); tree2link(pt, n->right, level - 1, flag); } else { tree2link(pt, n->right, level - 1, flag); tree2link(pt, n->left, level - 1, flag); } }}node *recurBitree2dl(node *root) { if (!root) return NULL; node head; node* pt = &head; int h = height(root) - 1; bool flag = true; for (int i = h; i >= 0; --i) { tree2link(pt, root, i, flag); flag = ~flag; }}
////////////////////////////////////////////////////////////////////////////////////
以下的代码都有错误
如果允许用额外空间,题目相对比较简单
Node *tree2Link(Node *root) { if (root == NULL) return NULL; vector<Node *> vec; bool flag = true; vec.push_back(root); int beg = 0, end = 0; Node head; Node *t = &head; while (!vec.empty()) { if (flag) { int i = beg; for (;i< = end; ++i) { Node *tmp = vec[i]; if (tmp->left) vec.push_back(tmp->left); if (tmp->right) vec.push_back(tmp->right); t->right = tmp; tmp->left = t; t = tmp; } } else { int i = end; for (; i >= beg; --i) { Node *tmp = vec[i]; if (tmp->right) vec.push_back(tmp->right); if (tmp->left) vec.push_back(tmp->left); t->right = tmp; tmp->left = t; t = tmp; } } beg = end + 1; end = vec.size() - 1; flag = ~flag; } return head.right;}
不用额外空间,在网上看到一种方法,复杂度比较高,但是思路不错。
先计算出数的高度,从最低层开始逐层连接。
struct node{ struct node *left; struct node *right; int data;};struct node *rslt;//Global structure pointer..it point to head of doubly linked list int height(struct node* head){ if(head==NULL) return 0; if(head->left==NULL && head->right==NULL) return 0; int lh=height(head->left); int rh=height(head->right); return lh>rh?(lh+1):(rh+1);}struct node* appnd(struct node *a,struct node *b){ if(a==NULL)return b; if(b==NULL)return a; struct node* result=a; while(a->left!=NULL) a=a->left; a->left=b; b->right=a; //b->left=NULL; return result;}void printGivenLevel(struct node* head,int level,int ltr){ if(head==NULL) return; if(level==0) { appnd(rslt, head); rslt = head; } if(level>0) { if(ltr) { printGivenLevel(head->left,level-1,ltr); printGivenLevel(head->right,level-1,ltr); } else { printGivenLevel(head->right,level-1,ltr); printGivenLevel(head->left,level-1,ltr); } }}void printGivenOrder(struct node* head){ int i=0; int ltr=0; for(i=height(head); i >= 0; i--) { printGivenLevel(head,i,ltr); ltr=~ltr; }}struct node* NewNode(int data){ struct node* tmp=(struct node *)malloc(sizeof(struct node)); tmp->data=data; tmp->left=NULL; tmp->right=NULL; return tmp;}void printList(struct node* node){ struct node* current=node; while(current) { printf("%d ----> ",current->data); current=current->right; }}int main(){ struct node* start=NULL; start=NewNode(1); start->left=NewNode(2); start->right=NewNode(3); start->left->left=NewNode(4); start->left->right=NewNode(5); start->right->left=NewNode(6); start->right->right=NewNode(7); printGivenOrder(start); printList(rslt); return 0;}
- 将二叉树按照螺旋顺序分层连接
- 每天一道LeetCode-----将m × n矩阵按照顺时针螺旋顺序转化成一维数组
- 按照之字形顺序打印二叉树
- 二叉树螺旋遍历
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层打印二叉树
- 分层打印二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- 分层遍历二叉树
- Ubuntu 12.04开机默认进入命令行模式.
- UML图之四——活动图
- [Leetcode] Maximum Depth of Binary Tree
- CentOS下安装mplayer
- UML图之五——时序图
- 将二叉树按照螺旋顺序分层连接
- ASP.NET与JavaScript轻松实现输入信息验证
- 记录点滴31
- Seo优化之服务器优化
- 使用Xcode和Instruments调试解决iOS内存泄露
- 你不知道你不懂javascript
- 理解ASP.NET的DataReader(C#)
- 磁盘清理之后数据库不能够访问 数据库不能够访问 ,特定的错误3417
- UML图之六——协作图