树分别在"静态(即数组)实现"和"指针实现"方式下的基操

// 树分别在"静态(即数组)实现"和"指针实现"方式下的 ---------------------------------------------------------
// 基操(定义节点/建树/查改/插/遍历/重建):

// 二叉树的指针实现方式:
// 树节点的定义
struct node {
	int data;
	node* l;
	node* r;
};
node* root = NULL;
// 新建节点
node* newNode(int v) {
	node* Node = new node;
	Node->data = v;
	Node->l = Node->r = NULL;
	return Node;
}
// 节点的查找及修改
void search(node* root, int x, int newdata) {
	if(root == NULL) return;
	if(root->data == x) root->data = newdata;
	search(root->l, x, newdata);
	search(root->r, x, newdata);
}
// 插入新节点
void insert(node* &node, int x) { //注意引用
	if(root == NULL) {
		root = newNode(x);
		return;
	}
	if(/*由二叉树的性质,x应该插在左子树*/) {
		insert(root->l, x);
	} else {
		insert(root->r, x);
	}
}
// 新建二叉树
node* create(int data[], int n) {
	node* root = NULL;
	for(int i=0; i<n; i++) {
		insert(root, data[i]);
	}
	return root;
}
// 二叉树的遍历和重建 略...

// 二叉树的静态(即 数组)实现方式:
// 定义节点(数组)
struct node{
	int data;
	int l;
	int r;
} Node[MAXN];
// 生成节点
int index = 0;
int newNode(int x) {
	Node[index].data = v; //只有指针方式才用到 " -> "
	Node[index].l = Node[index].r = -1;
	return index++; // 返回在数组中的下标
}
// 节点的查找及修改
void search(int root, int x, int newdata) {
	if(root == -1) return;
	if(Node[root].data == x) {
		Node[root],data = newdata;
		return;
	}
	search(Node[root].l, x, newdata);
	search(Node[root].r, x, newdata);
}
// 插入
void insert(int &root, int x) { //注意引用
	if(root == -1) {
		root = newdata(x);
		return;
	}
	if(/*由二叉树的性质,x应该插在左子树*/) {
		insert(Node[root].l, x);
	} else {
		insert(Node[root].r, x);
	}
}

// 树的静态写法:
// 树的定义
struct node {
	int data;
	vector<int> child;  //变长数组 //int child[maxn];  //存放所有子节点的下标
}Node [MAXN];

猜你喜欢

转载自blog.csdn.net/chushoufengli/article/details/80033089