zoukankan      html  css  js  c++  java
  • 数据结构

    数据结构 - 树

    首先回忆一下树的术语

    1. 节点的度:一个节点含有的子树的个数称为该节点的树
    2. 树的度:一棵树中,最大的节点的度称为树的度
    3. 节点的层次:从根开始定义,根为第一层(有时候定义为第0层)
    4. 高度:对于任意节点n,n的高度为n到一片树叶的最长路径的长度,所有树叶的高度为0

    树的遍历

    • 前序遍历:先访问根,然后访问左右子树
    • 中序遍历:先访问左子树,然后访问根,最后访问右子树
    • 后序遍历:先访问子树,然后访问根
    • 层序遍历:先访问离根节点最近的节点,按层遍历
    #include<iostream>
    using namespace std;
    
    //树,定义左右子树
    struct Node
    {
    	int lch = -1; //左节点 
    	int rch = -1; //右节点 
    	//现在都是-1,表示现在什么都不指向 
    }; 
    
    bool vis[29];
    bool isnotroot[29];
    
    Node tree[29];
    char s[5];
    void build(int p,int l,int r)
    {
    	vis[p]=true;
    	if(l>=0)
    	{
    		tree[p].lch=l;
    		vis[l]=true;
    		isnotroot[l]=true; 
    	}
    	if(r>=0)
    	{
    		tree[p].rch=r;
    		vis[r]=true;
    		isnotroot[r]=true;
    	}
    } 
    
    void pre_order(int r)
    {
    	if(r<0)
    	{
    		return ;
    	}
    	
    	//递归 
    	cout<<char(r+'a');
    	pre_order(tree[r].lch);
    	pre_order(tree[r].rch);
    	//四种遍历方法,就是改变这三句的顺序 
    }
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>s;
    		build(s[0]-'a',s[1]-'a',s[2]-'a');
    	}
    	
    //输出,因为只有26个字母,直接输出树的根节点即可
    	for(int i=0;i<26;i++)
    	{
    		if(vis[i]&&!isnotroot[i])  
    		{
    			pre_order(i);
    			break;
    		}
    	}
    	cout<<endl;
    	return 0;
    }
    
  • 相关阅读:
    opencv学习笔记(五)镜像对称
    opencv学习笔记(四)投影
    C++文件读写详解(ofstream,ifstream,fstream)
    C++ 提取字符串中的数字
    opencv学习笔记(三)基本数据类型
    opencv学习笔记(二)寻找轮廓
    分别心
    关于bonecp和QuerRunner
    关于AutoCommit
    一个detect问题引发的一系列思考
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/12663972.html
Copyright © 2011-2022 走看看