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

Posted liugl7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个二叉树的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 

 

以上是关于给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点的主要内容,如果未能解决你的问题,请参考以下文章

507,BFS和DFS解二叉树的层序遍历 II

Leetcode 104. 二叉树的最大深度 dfs

107. 二叉树的层次遍历 II

Leetcode题目104.二叉树的最大深度(DFS+BFS简单)

代码题— 二叉树的层次遍历

二叉树的层序遍历