给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点。

思路:第一遍先把*也插入到树中,第二遍把*改成NULL。

如果直接把*记录为NULL,那再来一个节点就不知道,到底是*赋值的NULL,还是本身自带的NULL。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 struct TreeNode{
 5     char val;
 6     TreeNode* left;
 7     TreeNode* right;
 8     TreeNode(char nval){
 9         val = nval;
10         left = NULL;
11         right = NULL;
12     }
13 };
14
15 TreeNode* construct(string str){
16     if(str.empty()) return NULL;
17
18     stack<TreeNode*> temp;
19     TreeNode* root = new TreeNode(str[0]);
20     temp.push(root);
21
22     for(int i=1; i<str.size(); i++){
23         if( str[i]>=‘a‘ && str[i]<=‘z‘ ){
24             TreeNode* newNode = new TreeNode(str[i]);
25             while(temp.top()->left && temp.top()->right ) temp.pop();
26
27             if(temp.top()->left ==NULL) temp.top()->left = newNode;
28             else if(temp.top()->right==NULL ) {
29                 temp.top()->right= newNode;
30             }
31             temp.push(newNode);
32         }
33         else if(str[i]==‘*‘){
34             TreeNode* newNode = new TreeNode(str[i]);
35             if(temp.top()->left ==NULL) temp.top()->left = newNode;
36             else if( temp.top()->right==NULL ){
37                 temp.top()->right = newNode;
38                 temp.pop();
39             }
40         }
41
42     }
43
44     //按层遍历,将*改为NULL
45     queue<TreeNode*> que;
46     TreeNode* cur = NULL;
47     que.push(root);
48     while( !que.empty() ){
49         int size = que.size();
50         while(size--){
51             cur = que.front();
52             que.pop();
53             if(cur->left && cur->left->val==‘*‘){
54                 cur->left = NULL;
55             }
56             if(cur->left && cur->left->val!=‘*‘){
57                 que.push(cur->left);
58             }
59
60             if(cur->right && cur->right->val == ‘*‘){
61                 cur->right = NULL;
62             }
63             if(cur->right && cur->right->val !=‘*‘){
64                 que.push(cur->right);
65             }
66         }
67     }
68
69     return root;
70
71 }
72
73 void search(TreeNode* root, string& res){
74     if(root==NULL){
75         res+=‘*‘;
76         return;
77     }
78 //    res += root->val;
79     search(root->left, res);
80     res += root->val;
81     search(root->right, res);
82 }
83
84
85 int main(){
86 //    string str = "abdm***n**ew**cf**g**";
87     string str = "ab*gf***c*de**f**";
88     TreeNode* root = construct(str);
89
90     string out="";
91     search(root, out);
92
93     cout<<out<<endl;
94
95 }

原文地址:https://www.cnblogs.com/liugl7/p/11286054.html

时间: 2024-10-08 09:01:40

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点的相关文章

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 下面用Java实现对二叉树的先序遍历,中序遍历,后序遍历.广度优先遍历.深度优先遍历.转摘请注明:http://blog.csdn.net/qiuzhping/article/details/44830369 package com.qiuz

二叉树的层次遍历 II

二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 标签 二叉树 队列 二叉树遍历 宽度优先搜索 1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int

lintcode 中等题:binary tree level order traversal ii 二叉树的层次遍历II

题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 解题 和上一题的答案反过来 直接每次在list中第一个位置加入当前层结点 /** * Definition of TreeNode: * public class TreeNode { *

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回

题目:给定一个二叉树其中的一个结点(此节点可以为二叉树任意一个节点),请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 此二叉树的中序遍历为:8.4.9.2.10.5.1.6.3.7 思路: (1)如果此结点有右结点:返回 此结点的右结点 的最左的结点(例如4.2) (2)如果此结点没有右结点:(1)此结点为根节点:返回None  (2)此结点为上一个结点的左节点:返回上一个结点(例如结点6.8)  (3)此结点为上一个结点的右节点:(1)此

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

给定一个二叉树,获取该二叉树的宽度深度

题目: Description 给定一个二叉树,获取该二叉树的宽度深度. Prototype int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) Input Param head   须要获取深度的二叉树头结点 Output Param pulWidth   宽度 pulHeight  高度 Return Value 0          成功 1          失败或其它异常 分析

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序訪问"图"中全部的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现. 广度优先(优先走近期的).用的数据结构是队列.主要是迭代实现. 对于深搜.因为递归往往能够方便的利用系统栈,不须要自己维护栈.所以通常实

二叉树中序遍历的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路:分多种情况讨论 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NU

【剑指offer】8、二叉树中序遍历的下一个节点

题目 给定一个二叉树和其中一个节点,找出中序遍历的下一个节点.注意:树的节点中除了有指向左右节点的指针,还有指向父节点的指针. 思路 (1)若该节点Node有右子树,则下一个节点就是右子树中的最左节点,就是在右节点中一直往左子树找. (2)若Node没有右子树 (i)Node是左子节点,则下一个节点就是node的父节点. (ii)Node是右子节点,则下一个节点就要一直向上找,找到第一个左子节点,也就是第一种情况. /* struct TreeLinkNode { int val; struct