前言
给大家提供一下,力扣刷题的时候,在本地 IDE 测试时,链表和二叉树的数组初始化工具。
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用初始化列表初始 List
initializer_list
记得包含这个头文件
#include <initializer_list>
struct ListNode
{
int val;
ListNode* next;
ListNode(int val) : val(val), next(nullptr) {}
ListNode(std::initializer_list<int> lst) : ListNode(*lst.begin()){
for(auto i = lst.end() - 1; i != lst.begin(); --i){
ListNode* tmp = new ListNode(*i);
tmp->next = this->next;
this->next = tmp;
}
}
};
二、使用初始化列表初始 二叉树
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
Node* createTree_2(vector<int> &tmp,int n,int start){//使用了递归
if (tmp[start] == '#') return NULL;//当根节点为空,即空树
Node* root=new Node(tmp[start]);
int lNode=2*start+1;
int rNode=2*start+2;
if(lNode>n-1) root->left = NULL;
else root->left = createTree_2(tmp,n,lNode);
if(rNode>n-1) root->right = NULL;
else root->right = createTree_2(tmp,n,rNode);
return root;
}
二叉树的前、中、后序遍历非递归实现
void pre(Node* bt){//根左右
Node* T=bt;
if(!T) return;
stack<Node*> s;
while (T || !s.empty())
{
while(T){
cout<<T->val<<" ";//遍历左子树
s.push(T->right);//把右子树压入栈中
T=T->left;
}
if(!s.empty()){
T=s.top();
s.pop();
}
}
}
void mid(Node* bt){//左根右
Node* T=bt;
if(!T) return;
stack<Node*> s;
while (T || !s.empty())
{
while(T){
s.push(T);//把左子树压入栈中
T=T->left;
}
if(!s.empty())
{
T=s.top();
s.pop();
cout<<T->val<<" ";
T = T->right;
}
}
}
void post(Node* bt){//左右根
Node* T=bt;
if(!T) return;
stack<Node*> s;
Node* last=NULL;
while (T || !s.empty()){
while (T){
s.push(T);
T=T->left;
}
if(!s.empty()){
T=s.top();
if(!T->right || T->right == last){
cout<<T->val<<" ";
last=T;
s.pop();
T=NULL;
}else{
T = T->right;
}
}
}
}
总结
冲力扣,二叉树创建有缺陷,更新了第二版