zoukankan      html  css  js  c++  java
  • 题目1503:二叉搜索树与双向链表

    题目描述:

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

    输入:

    输入可能包含多个测试样例。
    对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
    接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。

    输出:

    对应每个测试案例,
    输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。

    样例输入:
    1
    2 1 0 0 3 0 0
    样例输出:
    1 2 3
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int a[1000],cnt;
    
    struct Node
    {
    	int x;
    	struct Node *left;
    	struct Node *right;
    };
    
    void createTree(Node *&root){
    	int x;
    	scanf("%d",&x);
    	if(!x)
    		root = NULL;
    	else{
    		root = new Node;
    		root->x = x;
    		createTree(root->left);
    		createTree(root->right);
    	}
    }
    
    
    void convert(Node *root,Node *&last){
    	if(root == NULL)
    		return;
    	Node *p = root;
    	if(p->left != NULL){
    		convert(p->left,last);
    	}
    	p->left = last;
    	if(last != NULL)
    		last->right = p;
    	last = p;
    	if(p->right != NULL)
    		convert(p->right,last);
    }
    
    int main(int argc, char const *argv[])
    {
    	int n;
    	while(scanf("%d",&n) != EOF){
    		while(n--){
    			Node *root,*head,*last,*p;
    			last = NULL;
    			createTree(root);
    			convert(root,last);
    			head = last;
    			while(head != NULL && head->left != NULL)
    				head = head->left;
    			p = head;
    			while(p){
    				printf("%d ",p->x);
    				p = p->right;
    			}
    			printf("
    ");
    		}
    	}
    	return 1;
    }


  • 相关阅读:
    24-反转链表
    23-链表中环的入口节点
    22-链表中倒数第k个节点
    21-调整数组顺序使奇数位于偶数前面
    18-删除链表的节点
    17-打印从1到最大的n位数
    16-数值的整数次方
    15-二进制中1的个数
    14-剪绳子
    13-机器人的运动范围
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3170370.html
Copyright © 2011-2022 走看看