zoukankan      html  css  js  c++  java
  • [PAT] A1099 Build A Binary Search Tree

    题目大意

    给出二叉搜索树的树型和各个节点值,求出该树的后序遍历结果。

    思路

    用静态结构体数组表示树。序列按照值从小到大即树的中序遍历结果。根据输入确定树型,在中序遍历的过程中填入值。接着层序遍历一次输出即可。(也可遍历时标记满二叉树情况下的index,根据index值从大到小输出即为层序遍历结果)

    AC代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include<algorithm>
    #include<queue>
    #include <cstring>
    using namespace std;
    struct Node {
    	int key;
    	int lchild, rchild;
    }node[100];
    vector<int>in;
    int t = 0;
    void in_insert(int v) {
    	if (node[v].lchild != -1)in_insert(node[v].lchild);
    	node[v].key = in[t];
    	t++;
    	if (node[v].rchild != -1)in_insert(node[v].rchild);
    }
    void levelorder() {
    	queue<int>q;
    	q.push(0);
    	bool space = false;
    	while (!q.empty()) {
    		int v = q.front();
    		q.pop();
    		if (space == false) {
    			printf("%d", node[v].key);
    			space = true;
    		}
    		else {
    			printf(" %d", node[v].key);
    		}
    		if (node[v].lchild != -1)q.push(node[v].lchild);
    		if (node[v].rchild != -1)q.push(node[v].rchild);
    	}
    }
    bool cmp(int a, int b) {
    	return a < b;
    }
    int main() { 
    	int n, i;    
    	scanf("%d", &n);    
    	for (i = 0;i < n;i++) {
    		scanf("%d%d", &node[i].lchild, &node[i].rchild);
    	}
    	int value;
    	for (i = 0;i < n;i++) {
    		scanf("%d", &value);
    		in.push_back(value);
    	}
    	sort(in.begin(), in.end(), cmp);
    	in_insert(0);
    	levelorder();
    	return 0; 
    }
    
    

    不用层次遍历,直接赋值index的方法。代码如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include<algorithm>
    #include<queue>
    #include <cstring>
    using namespace std;
    struct Node {
    	int key;
    	int lchild, rchild;
    	int index, lebel;
    }node[100];
    vector<int>in;
    int t = 0;
    void in_insert(int v, int index, int lebel) {
    	if (node[v].lchild != -1)in_insert(node[v].lchild, index * 2 + 1, lebel + 1);
    	node[v].index = index;
    	node[v].lebel = lebel;
    	node[v].key = in[t];
    	t++;
    	if (node[v].rchild != -1)in_insert(node[v].rchild, index * 2 + 2, lebel + 1);
    }
    bool cmp(int a, int b) {
    	return a < b;
    }
    bool cmpindex(Node a, Node b) {
    	if (a.lebel != b.lebel)return a.lebel < b.lebel;
    	return a.index < b.index;
    }
    int main() { 
    	int n, i;    
    	scanf("%d", &n);    
    	for (i = 0;i < n;i++) {
    		scanf("%d%d", &node[i].lchild, &node[i].rchild);
    	}
    	int value;
    	for (i = 0;i < n;i++) {
    		scanf("%d", &value);
    		in.push_back(value);
    	}
    	sort(in.begin(), in.end(), cmp);
    	in_insert(0, 0, 0);
    	sort(node, node + n, cmpindex);
    	printf("%d", node[0].key);
    	for (i = 1;i < n;i++)
    		printf(" %d", node[i].key);
    	return 0; 
    }
    
    

    疑问:为啥如果不用lebel,就会有两个测试点(1、2)过不了???求路过的大神帮忙解答一下,万分感激!!!

  • 相关阅读:
    菱形继承问题
    类的组合
    类的派生
    EasyUI的columns中列标题居中
    C#的一般处理程序中Cookie的写入、读取、清除
    JS中设置input的type="radio"默认选中
    SQL Server 分页语句查询
    CSS中设置字体样式
    C#清空StringBuilder的三种方法
    EasyUI在子tab基础上再打开新的tab标签页
  • 原文地址:https://www.cnblogs.com/yue36/p/13308112.html
Copyright © 2011-2022 走看看