• 题目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;
    }


  • 相关阅读:
    指针简单笔记
    Subway Lines (树链剖分+线段树)
    C#运动控制指示灯闪烁和系统复位(两个子窗体交互:一个子窗体按钮控制另外一个子窗体的方法)
    C# “|” 和 “||” “&”和“&&”区别
    2022/4/112022/4/16
    《Effective Modern C++》概览
    实验一 密码引擎4国䀄算法交叉测试
    实验一
    关于DDMS不显示进程的解决方法
    JNI接口native函数调用过程
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3170370.html
Copyright © 2020-2023  润新知