二叉树的构建
来源:5-2 二分搜索树基础 (Binary Search Tree)
Mosea
2022-03-30
#include<iostream>
#include<vector>
#include<string>
#include<queue>
using namespace std;
struct Node{
char data;
Node* left ;
Node* right ;
Node(){
data = ' ';
left = nullptr;
right = nullptr;
}
Node(char a){
data = a;
left = nullptr;
right = nullptr;
}
};
// 创建二叉树
//注意这里是传指针的指针,或者指针的引用 为什么?
//如果是传指针,指针本质也是值传递,就是拷贝一份指针,如果给指针赋值,
//也只是对拷贝的指针赋值,而对原来的指针没有影响。
//数组中 假设 索引下标 i 为根结点 左孩子的下标为2*i+1, 右孩子的下标为2*i+2
void createTree(Node *&root, int i, string& tree,int& length)
{
if(i > length-1 || tree[i] == '#')//#表示值为空
return ;
root = new Node(tree[i]);
createTree(root->left, 2*i+1, tree,length);
createTree(root->right, 2*i+2, tree,length);
}
// 前序打印
void prePrintTree(Node *root)
{
if(root == nullptr)
return ;
cout<<root->data;
prePrintTree(root->left);
prePrintTree(root->right);
}
// 中序打印
void inPrintTree(Node *root)
{
if(root == nullptr)
return ;
inPrintTree(root->left);
cout<<root->data;
inPrintTree(root->right);
}
// 后序打印
void postPrintTree(Node *root)
{
if(root == nullptr)
return ;
postPrintTree(root->left);
postPrintTree(root->right);
cout<<root->data;
}
void levelPrintTree(Node *root){
if(root == nullptr)
return;
queue<Node*> q;
q.push(root);
while(!q.empty()){
int level_s = q.size();
for(int i=0;i<level_s;i++){
cout<<q.front()->data;
if(q.front()->left) q.push(q.front()->left);
if(q.front()->right) q.push(q.front()->right);
q.pop();
}
cout<<endl;
}
}
int main(){
string tree = "ABCDEF";
Node *head = nullptr;
int length = sizeof(tree);
createTree(head, 0, tree,length);
prePrintTree(head);
cout<<endl;
inPrintTree(head);
cout<<endl;
postPrintTree(head);
cout<<endl;
levelPrintTree(head);
cout<<endl;
return 0;
}
关于构建二叉时传递指针的指针问题
第一次写的时候传指针,发现没有构建二叉树,后来传指针的指针,或者指针的引用就成功了。
void createTree(Node **root, int i, string& tree,int& length)
{
if(i > length-1 || tree[i] == '#')//#表示值为空
return ;
*root = new Node(tree[i]);
createTree(&((*root)->left), 2*i+1, tree,length);
createTree(&((*root)->right), 2*i+2, tree,length);
}
我这里写的是函数形式/创建二叉树,这里是传指针的指针,或者是指针的引用,为什么?
如果是传指针,指针本质也是值传递,就是拷贝一份指针,如果给指针赋值,也只是对拷贝的指针赋值,而对原来的指针没有影响。 老师,可以请问一下我这么思考问题对吗?
写回答
1回答
-
liuyubobobo
2022-03-30
“如果是传指针,指针本质也是值传递” 。完全正确!!!只不过拷贝的是这个指针。
另外,创建二叉树的“标准写法”,应该是把创建好的二叉树的根节点返回回去(即返回 Node*),这样就不需要传指针的指针了。比如这里 insert 函数的样子:https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/05-Binary-Search-Tree/Course%20Code%20(C%2B%2B)/03-Binary-Search-Tree-Insert/main.cpp
继续加油!:)
012022-03-30
相似问题
搜索二叉树结构?
回答 1
二分搜索树的创建问题
回答 1