zoukankan      html  css  js  c++  java
  • 两道基础题

    反转链表

    #include <iostream>
    #include<bits/stdc++.h>
    using namespace std;
    
    //单链表的结构
    struct ListNode 
    {
        int val;
        ListNode *next;
        
        // 初始化方法 
        ListNode() : val(0), next(NULL) {}
        ListNode(int x) : val(x), next(NULL) {}
        ListNode(int x, ListNode *next) : val(x), next(next) {}
    };
    
    // 从数组中创建链表,a表示数组,n表示数组的长度 
    ListNode* CreateList(int const* a, int n)
    {	
    	ListNode* l = (ListNode*)malloc(sizeof(ListNode));
    	ListNode* temp = l;
    	l->val = a[0];
    	for(int i = 1; i < n; ++i) {
    		ListNode* t = (ListNode*)malloc(sizeof(ListNode));
    		t->val = a[i];
    		temp->next = t;
    		temp = t;
    	}
    	temp->next = NULL;
    	return l;
    }
    
    // 打印链表中的元素 
    void DisplayList(ListNode* head)
    {
    	while(head) {
    		cout << head->val << " ";
    		head = head->next;
    	}
    	cout << endl;
    }
    
    // 清空链表
    void DeleteList(ListNode* &head)
    {
    	if (head != NULL)
    	{
    		DeleteList(head->next);
    		delete(head); //用new创建,就用delete销毁,用malloc创建,就用free销毁 
    		head = NULL;
    	}
    }
    
    // 反转链表 
    ListNode* Reverse(ListNode* head)
    {
    	ListNode* s = NULL;
    	ListNode* cur = head;
    	while(cur) {
    		ListNode* t = cur->next;
    		cur->next = s;
    		s = cur;
    		cur = t;
    	}
    	return s;
    }
    
    int main()
    {
    	int const a[] = {1,21,10000,0};
    	ListNode* head = CreateList(a, sizeof(a)/sizeof(a[0]));
    	
    	cout<<"链表的初始状态为:";
    	DisplayList(head);
    	
    	head = Reverse(head);
    	
    	cout<<"链表的反转状态为:";
    	DisplayList(head);
    
    	DeleteList(head); 
    	cout<<"链表已清空,head指针的值为"<<head<<endl;
    	return 0;
    }
    
    

    判断二叉树是否同构

    #include <iostream>
    using namespace std;
    
    // 树的结构 
    typedef struct node 
    {
    	int data;					//数据元素
    	struct node *lchild;		//指向左孩子结点
    	struct node *rchild;		//指向右孩子结点
    	
    	// 初始化方法 .0000000000000000000000000000000000
    	node() : data(0), lchild(NULL), rchild(NULL) {}
        node(int x) : data(x), lchild(NULL), rchild(NULL) {}
        node(int x, node *lchild) : data(x), lchild(lchild), rchild(NULL) {}
        node(int x, node *lchild, node *rchild) : data(x), lchild(lchild), rchild(rchild) {}
        
    } BTNode;						//二叉链结点类型
    
    BTNode *CreateBTree(int a[],int b[],int n)	//对应例2.8的算法
    //由先序序列a[0..n-1]和中序序列b[0..n-1]建立二叉链
    {
    	int k;
    	if (n<=0) return NULL;
    	int root=a[0];			//根结点值
    	BTNode* bt = new BTNode(root);
    	
    	for (k=0;k<n;k++)			//在b中查找b[k]=root的根结点
    		if (b[k]==root) break;
    		
    	bt->lchild = CreateBTree(a + 1, b, k);			//递归创建左子树
    	bt->rchild = CreateBTree(a + k + 1, b + k + 1, n - k - 1);	//递归创建右子树
    	return bt;
    }
    
    void DisplayBTree(BTNode *bt)				//采用括号表示输出二叉链bt
    {
    	/*
    	样例:
    			1
    		     / 
    		    2   3
    		   /     
    		  4       5
    
    	输出:1(2(4),3(,5))
    	*/
    	if(bt!=NULL) {
    		cout << bt->data;
    		if(bt->lchild != NULL || bt->rchild != NULL) {
    			cout << "(";
    			DisplayBTree(bt->lchild);
    			if(bt->rchild != NULL)	cout << ",";
    			DisplayBTree(bt->rchild);
    			cout << ")";		
    		}
    	}
    }
    void DestroyBTree(BTNode *&bt)		//对应例2.9的算法
    //释放以bt为根结点的二叉树
    {	if (bt != NULL)
    	{
    		DestroyBTree(bt->lchild);
    		DestroyBTree(bt->rchild);
    		delete(bt);
    		bt = NULL;
    	}
    }
    
    bool Isomorphism(BTNode* bt1, BTNode* bt2)
    {
    	if((bt1 == NULL) && (bt2 == NULL)) {
    		return 1;
    	} 
    	if(bt1 == NULL && bt2 != NULL || bt1 != NULL && bt2 == NULL) {
    		return 0;
    	}
    	return Isomorphism(bt1->lchild, bt2->lchild) && Isomorphism(bt1->rchild,bt2->rchild);
    }
    
    
    int main()
    {
    	// 首先创建三棵树 
    	BTNode *bt1, *bt2, *bt3; 
    	
    	int a[] = {5, 2, 3, 4, 1, 6};
    	int b[] = {2, 3, 5, 1, 4, 6};
    	bt1 = CreateBTree(a, b, sizeof(a)/sizeof(a[0]));
    	
    	int c[] = {2, 5, 1, 4, 3, 6};
    	int d[] = {5, 1, 2, 3, 4, 6};
    	bt2 = CreateBTree(c, d, sizeof(c)/sizeof(c[0]));
    	
    	int e[] = {4, 1, 2, 6, 3, 5};
    	int f[] = {2, 1, 4, 3, 6, 5};
    	bt3 = CreateBTree(e, f, sizeof(e)/sizeof(e[0]));
    	
    	cout<<"二叉树bt1:"; DisplayBTree(bt1); cout<<endl;
    	cout<<"二叉树bt2:"; DisplayBTree(bt2); cout<<endl;
    	cout<<"二叉树bt3:"; DisplayBTree(bt3); cout<<endl;
    	
    	cout<<"二叉树bt1和bt2"<<(Isomorphism(bt1, bt2)?"同构":"不同构")<<endl;
    	cout<<"二叉树bt1和bt3"<<(Isomorphism(bt1, bt3)?"同构":"不同构")<<endl;
    	
    	DestroyBTree(bt1);
    	DestroyBTree(bt2);
    	DestroyBTree(bt3);
    	cout<<"二叉树已销毁,bt1,bt2,bt3的指针的值分别为"<<bt1<<' '<<bt2<<' '<<bt3<<endl;
     	return 0;
    }
    
    
    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    ProtoType Design Tools
    什么是publickeytoken及publickeytoken的作用
    Windows最高权限system帐户
    Q70 AV01本本安装MAC
    解决MDict3在PPC下乱码的问题
    QT_XSP.CPP
    QT_XSP.CPP
    SetupFactory脚本
    DVD IFO FILE HEADER
    SerialPort comstat is being used without defining
  • 原文地址:https://www.cnblogs.com/lightac/p/14578848.html
Copyright © 2011-2022 走看看