二叉树的构建

来源: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


继续加油!:)

0
1
Mosea
谢谢老师!
2022-03-30
共1条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程