精华内容
下载资源
问答
  • 列出叶结点

    2020-08-16 21:40:59
    7-1 列出叶结点 (25分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每...

    7-1 列出叶结点 (25分)

    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

    输入格式:

    首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。

    输出格式:

    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    8
    1 -

    0 -
    2 7

    5 -
    4 6

    输出样例:

    4 1 5

    思路

    创建树的组成(数值,左支,右支),录入每个节点的左右编号(因为有‘-’,所以要以char为中介),逐个判断左右是否为‘-’,是则令其为-1(编号之外的数,避免影响判断),不是就赋值并为其左右标号,没有被赋值的节点为根(因为他没有作为孩子出现过)。
    找到根之后,从根到其左右子树寻找左右皆为-1的节点(没有孩子,是叶节点)。找的时候可以从根开始放进队列里,存在孩子就放进去,判断完了就移出,当队列为空代表判断结束。

    C++代码
    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include <string>
    using namespace std;
    
    struct node{
    	int l,r,num;
    };
    struct node tree[10];
    void print(struct node no);
    int f[10]={0};
    int main(){
    	int N;
    	cin>>N;
    	char a,b;
    	for(int i=0;i<N;i++){
    		cin>>a>>b;
    	} 
    	for(int i=0;i<N;i++){
    		tree[i].num=i;
    		if(a!='-'){
    			tree[i].l=a-'0';
    			f[i]=1;
    		}else {
    			tree[i].l=-1;
    		}
    		if(b!='-'){
    			tree[i].r=b-'0';
    			f[i]=1;
    		}else {
    			tree[i].r=-1;
    		}
    	}
    	int root;
    	for(int i=0;i<N;i++){
    		if(f[i]==0){
    			root=i;
    			break;
    		}
    	}
    	print(tree[root]);
    }
    void print(struct node no){
    	int flag=1;
    	int len=0;
    	while(flag){
    		struct node N=no;
    		if(no.l==-1&&no.r==-1){
    			len++;
    			if(len==1) cout<<no.num;
    			else cout<<" "<<no.num;
    		}
    	}
    	if(no.l!=-1){
    		print(tree[no.l]);
    	}
    	if(no.r!=-1){
    		print(tree[no.r]);
    	}
    }
    
    
    展开全文
  • PAT 列出叶结点

    千次阅读 2018-05-12 10:22:54
    列出叶结点对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。输入格式:首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一...

    列出叶结点

    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

    输入格式:

    首先第一行给出一个正整数 N10),为树中结点总数。树中的结点从 0 到 N1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。

    输出格式:

    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    8
    1 -
    - -
    0 -
    2 7
    - -
    - -
    5 -
    4 6
    

    输出样例:

    4 1 5

    先找出根结点,然后再层次遍历找叶子即可,AC代码如下:

    #include<iostream>
    #include<string.h>
    #define MAX 15
    using namespace std;
    typedef struct BiTNode
    {
        int lchild;
        int rchild;
    }BiTNode;
    BiTNode p[MAX];
    int n,root,arr[MAX];
    int build()
    {
        char a,b;
        cin >> n;
        getchar();
        for(int i = 0;i < n; i++)
        {
            cin >> a >> b;
            if(a != '-')
            {
                p[i].lchild = a - '0';
                arr[p[i].lchild]++;
            }
            else
                p[i].lchild = -1;
            if(b != '-')
            {
                p[i].rchild = b - '0';
                arr[p[i].rchild]++;
            }
            else
                p[i].rchild = -1;
        }
        for(int i = 0;i < n; i++)
            if(!arr[i])
                return i;
    }
    void level()
    {
        int fx,head = 0,tail = 0,flag = 0,que[MAX];
        memset(que,0,sizeof(que));
        que[tail++] = root;
        while(head <  tail)
        {
            fx = que[head];
            if(p[fx].lchild == -1 && p[fx].rchild == -1)
            {
                !flag ? cout << fx : cout <<" "<< fx;
                flag++;
            }
            else if(p[fx].lchild != -1 && p[fx].rchild != -1)
            {
                que[tail++] = p[fx].lchild;
                que[tail++] = p[fx].rchild;
            }
            else if(p[fx].lchild == -1)
                que[tail++] = p[fx].rchild;
            else
                que[tail++] = p[fx].lchild;
            head++;
        }
    }
    int main()
    {
        root = build();
        level();
        return 0;
    }
    

    展开全文
  • 拼题A 列出叶结点

    2020-04-09 15:45:22
    拼题A 列出叶结点 题目描述 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行...

    拼题A 列出叶结点

    题目描述
    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
    输入格式:
    首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
    输出格式:
    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
    输入样例:

    8
    1 -
    - -
    0 -
    2 7
    - -
    - -
    5 -
    4 6
    

    输出样例:
    4 1 5

    沙雕的我直接用链表把题目给的树还原出来然后查找叶结点了。。。。
    后来发现,emmm,,,不用这么麻烦(好像两种方法也差不多hhh)
    两个版本都AC了~~
    上代码:
    版本一:链表还原版

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    typedef struct Tree * TreeLink;
    
    struct Tree
    {
     int data;
     TreeLink left_tree, right_tree;
    };
    
    int n;
    int ans[12];
    bool is_root[12];
    queue<TreeLink> q;
    
    int main()
    {
     	memset(is_root, true, sizeof(is_root));
     	
     	cin >> n;
     	
     	char l, r;
     	TreeLink *T;
     	T = (TreeLink *)malloc(sizeof(TreeLink) * 11);
     	
     	for (int i = 0; i < n; i++) // 记得为每个结点分配内存空间
      		T[i] = (TreeLink)malloc(sizeof(struct Tree));
      		
      	TreeLink root;
     	root = (TreeLink)malloc(sizeof(struct Tree));
     	
     	for (int i = 0; i < n; i++)
     	{
     		getchar();
      		cin >> l >> r;
      		
      		T[i]->data = i;
      		if (l == '-')
       			T[i]->left_tree = NULL;
      		if (r == '-')
      			T[i]->right_tree = NULL;
     		if (l != '-')
      		{
       			int ll = l - '0';
       			is_root[ll] = false;
       			T[i]->left_tree = T[ll];
      		}
      		if (r != '-')
      		{
       			int rr = r - '0';
       			is_root[rr] = false;
       			T[i]->right_tree = T[rr];
      		}
     	}
     	// 找根节点
     	int R;
     	for (int i = 0; i < n; i++)
     	{
      		if (is_root[i])
      		{
       			R = i;
       			break;
      		}
     	}
     	
     	int sum = 0;
     	if (n > 0)
     	{
      		root = T[R];
      		q.push(root);
      		
      		while (!q.empty())
      		{
       			TreeLink temp;
       			temp = q.front();
       			q.pop();
       			
       			if (temp->left_tree == NULL && temp->right_tree == NULL)
        				ans[sum++] = temp->data;
        				
       			if (temp->left_tree != NULL)
        				q.push(temp->left_tree);
        				
       			if (temp->right_tree != NULL)
        				q.push(temp->right_tree);
      		}
     	}
     	
     	for (int i = 0; i < sum; i++)
      		printf("%d%c", ans[i], i == sum - 1 ? '\n' : ' ');
     return 0;
    }
    
    
    

    版本二:简练版

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    struct Tree
    {
        int data;
        int left_tree, right_tree;
    };
    int n;
    static int flag = 0;
    
    void print(int n)
    {
        if(flag)
            printf(" %d", n);
        else
        {
            printf("%d", n);
            flag = 1;
        }
    }
    
    Tree T[12];
    bool is_root[12];
    queue<Tree> q;
    
    int main()
    {
        memset(is_root, true, sizeof(is_root));
        scanf("%d", &n);
        char l, r;
        for( int i = 0; i < n; i ++ )
        {
            getchar();
            scanf("%c %c", &l, &r);
            T[i].data = i;
            if(l == '-')
                T[i].left_tree = -1;
            if(r == '-')
                T[i].right_tree = -1;
            if(l != '-')
            {
                int ll = l - '0';
                T[i].left_tree = ll;
                is_root[ll] = false;
            }
            if(r != '-')
            {
                int rr = r - '0';
                T[i].right_tree = rr;
                is_root[rr] = false;
            }
        }
        // 找根节点
        int root;
        for( int i = 0; i < n; i ++ )
        {
            if(is_root[i])
            {
                root = i;
                break;
            }
        }
        
        if( n > 0 )
        {
            q.push(T[root]);
            while(!q.empty())
            {
                Tree t = q.front();
                q.pop();
                
                if(t.left_tree == -1 && t.right_tree == -1)
                    print(t.data);
                    
                if(t.left_tree != -1)
                    q.push(T[t.left_tree]);
                    
                if(t.right_tree != -1)
                    q.push(T[t.right_tree]);
            }
            printf("\n");
        }
        return 0;
    }
    展开全文
  • 7-1 列出叶结点

    千次阅读 2019-10-26 13:58:33
    7-1 列出叶结点 (40 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行...

    7-1 列出叶结点 (40 分)
    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

    输入格式:
    首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。

    输出格式:
    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:
    8
    1 -

    0 -
    2 7

    5 -
    4 6
    输出样例:
    4 1 5

    我的看法

    这道题目重点在于存储数据和如何遍历数据找到并输出树的叶子。
    我一开始是想用指针建一棵树,后来发现太麻烦。麻烦也就算了,还不知道建好的树如何层序遍历。于是把指针树都删掉了,直接存到数组里面。
    另外,在网上查了一下如何层序遍历一棵树,找到了递归的思路——写递归函数的时候记录一下相应的层就OK,其实还是先序遍历,只不过通过先序遍历把每一层的元素存到了一个vector数组里面,然后再根据层数,从vector【0】开始遍历每一个vector里面所有的元素,这样下来,就相当于一个层序从左往右的遍历啦!
    其实也不一定用vector,所有能充当二元数组的数据结构都可以,只不过一般的数组需要下标访问,而我们不知道每一层具体有几个元素,所以queue数组也是可以哒~
    另外,对于树根的查找,其实就是在创建这个数组树的时候,记录一下哪个节点没有出现在其他节点的左右孩子上,你会发现,就一个这样的点,即孤儿——祖宗,也就是树根。
    而对于格式问题,我一开始是大大咧咧地cout了“叶子 空格”的,发现都是格式错误。这个题格式要求前后都没有空格的,所以输出的时候要加一个判断,将空格放在树叶前面,而第一个树叶前面不加空格。
    AC代码如下:

    #include<iostream>
    #include<vector>
    using namespace std;
    struct node {
    	char left, right;
    } ;
    node treenode[11];
    vector <int> leaf[11];
    void cengxubianli(int root, int level) {
    	if (treenode[root].left == '-' && treenode[root].right == '-') {
    		leaf[level].push_back(root);
    		return;
    	}
    	if (treenode[root].left != '-') cengxubianli(treenode[root].left - '0', level + 1);
    	if (treenode[root].right != '-') cengxubianli(treenode[root].right - '0', level + 1);
    }
    int main() {
    	int n, findroot[11], reallyroot = 0;
    	for(int i=0;i<11;i++)
    	findroot[i]=0;
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cin >> treenode[i].left >> treenode[i].right;
    		findroot[treenode[i].left - '0'] = findroot[treenode[i].right - '0'] = 1;
    	}
    	for (int i = 0; i < n; i++)
    		if (findroot[i]==0) {
    			reallyroot = i;
    			break;
    		}
    	cengxubianli(reallyroot, 1);
        bool first=false;
    	for (int i = 1; i <= 10; i++) {
    		for (int j = 0; j < leaf[i].size(); j++) {
                if(first)cout<<" ";
                else first=true;
    			cout << leaf[i][j];
    		}
    	}
    	system("pause");
    	return 0;
    }
    
    
    展开全文
  • 树案例—列出叶结点

    2020-08-25 20:55:24
    基础实验4-2.2 列出叶结点 (25分) 建树+层序遍历 运行结果 代码 #include <iostream> #include <queue> #include <cstring> using namespace std; #define NUL -1 typedef struct TreeNode *...
  • 7-7列出叶结点

    千次阅读 2018-11-26 18:46:58
    7-7列出叶结点 (25 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后...
  • PTA 列出叶结点 (25分)

    2020-10-26 16:32:18
    PTA 列出叶结点 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出...
  • 列出叶结点 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个...
  • 列出叶结点【递归】【二叉树】 题目详情 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 ...
  • 7-4 列出叶结点 (25分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每...
  • pta-7-40 列出叶结点 (25分) 题目 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后...
  • 7-1 列出叶结点(25 分)

    千次阅读 2018-03-28 20:11:03
    7-1 列出叶结点(25 分)对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。输入格式:首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N ...
  • 基础实验4-2.2-列出叶结点-函数题解题代码测试结果问题整理 解题代码 #include<stdio.h> #include<stdlib.h> typedef struct queue que; struct queue { int left; int right; }; int main() { int N...
  • 7-1 列出叶结点 (40分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每...
  • 列出叶结点 这题我看网上,其他人基本上都是用bfs写的,这题我没用,收到了上题的启发,这是我自己写的,写的比较简单,好理解,也能是因为数据比较小,所以就能水过去 树的同构 给定两棵树T1和T2。如果T...
  • 7-16 列出叶结点 (25分)/(C语言实现)

    千次阅读 2020-04-08 17:43:20
    7-16 列出叶结点 (25分)/(C语言实现) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。...
  • 7-1 列出叶结点(25 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N ...
  • 7-4列出叶结点(20point(s)) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数N(≤10),为树中结点总数。树中的结点从 0 到N−1编号。随后N行,...
  • 列出叶结点(PTA)

    2020-12-15 11:48:44
    首先第一行给一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给 “-”。编号间以 1 个空格分隔。 输出...
  • 7-9 列出叶结点

    2020-06-21 10:51:49
    首先第一行给一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给 “-”。编号间以 1 个空格分隔。 输出...
  • 列出叶结点 pta简单易懂

    千次阅读 2019-06-09 18:53:04
    随后N行,每行给一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给 "-"。编号间以 1 个空格分隔。 输出格式: 在一行中按规定顺序输出节点的编号。编号间以 1 个空格分隔,行首尾不得有多余....

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
热门标签
关键字:

列出叶结点