數據結構:(代碼篇:003)樹的存儲結構和基本操作

 

 

 

 

 

1. 概念

子節點個數不限且沒有順序。

2.樹的遍歷

只有兩種:

先根遍歷和層序遍歷

先根遍歷就是先訪問根節點,再訪問子節點。

層序遍歷跟二叉樹的層次遍歷類似。

3.樹的存儲結構

二叉樹的存儲結構有靜態和動態,但是樹的子節點可以不限,如果用指針的話,不方便,所以這裏我用靜態,也就是數組存下標,但是子樹的個數可能不同,所以我用vector容器來存下標。

struct node{
	int data;
	vector<int> child;
} Node[range];      // Node前面要空一個空格 

4.新生成一個節點

int index=0;
bool IsRoot[range];
int newnode(int v){
	Node[index].data=v;
	Node[index].child.clear();
	return index++;
}

5.先根遍歷

void preroot(int root)
{
	cout<<Node[root].data<<" ";
	for(int i=0;i<Node[root].child.size();i++)
	{
		preroot(Node[root].child[i]);
	}
}

6.層序遍歷

void layerorder(int root){
	queue<int> s;
	s.push(root);
	while(!s.empty()){
		int t=s.front();
		s.pop();
		cout<<Node[t].data<<" ";
		for(int i=0;i<Node[t].child.size();i++)
		s.push(Node[t].child[i]);
	}
}

6.完整的代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define range 100
struct node{
	int data;
	vector<int> child;
} Node[range];      // Node前面要空一個空格 
int index=0;
bool IsRoot[range];
int newnode(int v){
	Node[index].data=v;
	Node[index].child.clear();
	return index++;
}
void preroot(int root)
{
	cout<<Node[root].data<<" ";
	for(int i=0;i<Node[root].child.size();i++)
	{
		preroot(Node[root].child[i]);
	}
}
void layerorder(int root){
	queue<int> s;
	s.push(root);
	while(!s.empty()){
		int t=s.front();
		s.pop();
		cout<<Node[t].data<<" ";
		for(int i=0;i<Node[t].child.size();i++)
		s.push(Node[t].child[i]);
	}
}
int main(){
	int i,j,t,n,m,k,Root=-1;
	cout<<"請輸入樹中節點個數:"<<endl;
	cin>>n;
	fill(IsRoot,IsRoot+n,true);
	for(i=0;i<n;i++)
	{
	    cout<<"請輸入樹中各節點值以及子樹下標:"<<endl;
		cin>>t;
		newnode(t);
		cout<<"請輸入該節點子樹個數:"<<endl;
		cin>>m;
		cout<<"請輸入子樹下標:"<<endl;
		for(j=0;j<m;j++)
		{
			cin>>k;
			IsRoot[k]=false;
			Node[t].child.push_back(k);
		}
		
	}
	for(i=0;i<n;i++)
	if(IsRoot[i])
	{
		Root=i;
		break;
	}
	preroot(Root);
	cout<<endl;
	layerorder(Root);
	return 0;
}

 

如有錯,請評論。

 

 

 

發佈了383 篇原創文章 · 獲贊 109 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章