• 算法与数据结构实验题6.4 order (二叉树)


    1、题目:

    2、代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct Node
    {
    	int left;
    	int right;
    	int father;
    	int ord;
    } node[100010];
    void preOrder(int m)
    {
    	if(m!=-1)
    	{
    		cout<<m<<" ";
    		preOrder(node[m].left);
    		preOrder(node[m].right);
    	}
    }
    
    void posOrder(int m)
    {
    	if(m!=-1)
    	{
    		posOrder(node[m].left);
    		posOrder(node[m].right);
    		cout<<m<<" ";
    	}
    }
    int main()
    {
    	int n;
    	cin>>n;
    	int i;
    	for(i=1; i<=n; i++)
    	{
    		cin>>node[i].father;
    	}
    	for(i=1; i<=n; i++)
    	{
    		int x;
    		cin>>x;
    		node[x].ord=i;
    	}
    	for(i=1; i<=n; i++)
    	{
    		node[i].left=-1;
    		node[i].right=-1;
    	}
    	//为每个结点设置儿子 
    	for(i=1; i<=n; i++)
    	{
    		if(node[node[i].father].left==-1)
    		{
    			node[node[i].father].left=i;
    		}
    		else
    		{
    			node[node[i].father].right=i;
    		}
    	}
    	//确认左右子树,调整左右儿子位置 
    	for(i=1; i<=n; i++)
    	{
    		if(node[i].left!=-1&&node[node[i].left].ord>node[i].ord)//如果左儿子在中序中的位置大于父亲在中序的位置,
    		//说明这个应该是右儿子 
    		{
    			swap(node[i].left,node[i].right);
    		}
    		if(node[i].right!=-1&&node[node[i].right].ord<node[i].ord)//如果右儿子在中序中的位置小于父亲在中序的位置,
    		//说明这个应该是左儿子
    		{
    			swap(node[i].left,node[i].right);
    		}
    	}
    	preOrder(1);
    	cout<<endl;
    	posOrder(1);
    	cout<<endl;
    	return 0;
    }
  • 相关阅读:
    纯JavaScripst的全选、全不选、反选 【转】
    Java 文件和byte数组转换
    nc命令使用详解
    mtr 命令详解
    Nginx主动检测方案---Tengine
    Apache相关安全设置
    tomcat APR的配置
    Vsftpd 配置详解
    FTP主动模式和被动模式的区别
    iptables配置详解
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/6015118.html
Copyright © 2020-2023  润新知