zoukankan      html  css  js  c++  java
  • 树中两个结点的最低公共祖先

    题目描述:

    给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。

    输入:

    输入可能包含多个测试样例。
    对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
    其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。
    第二行为树中的两个结点的值m1与m2(0<m1,m2<10000)。

    输出:

    对应每个测试案例,
    输出给定的树中两个结点的最低公共祖先结点的值,若两个给定结点无最低公共祖先,则输出“My God”。

    样例输入:
    2
    1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
    6 8
    1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
    6 12
    样例输出:
    2
    My God
    #include <cstdio>
    #include <iostream>
    #include <list>
    using namespace std;
    
    struct Node{
    	int x;
    	struct Node *left;
    	struct Node *right;
    
    };
    
    int path1[10000],path2[10000];
    int top1 = -1,top2 = -1;
    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);
    	 }
    }
    
    bool getPath(Node *root,int x,int path[],int &top){
    	path[++top] = root->x;
    	if(root->x == x)
    		return true;
    	bool found = false;
    	if(root->left)
    		found = getPath(root->left,x,path,top);
    	if(!found && root->right)
    		found = getPath(root->right,x,path,top);
    	if(!found)
    		top--;
    	return found;
    }
    
    int getCommonNode(int path1[],int path2[]){
    	int x;
    	int i = 0,j = 0;
    	while(i <= top1 && j <= top2){
    		if(path1[i] == path2[j])
    			x = path1[i];
    		i++;j++;
    	}
    	return x;
    }
    
    void destory(Node *&root){
    	if(root){
    		destory(root->left);
    		destory(root->right);
    		delete root;
    		root = NULL;
    	}
    }
    
    void print(Node *root){
    	if(root){
    		printf("%d ",root->x);
    		print(root->left);
    		print(root->right);
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	int n,a,b;
    	while(scanf("%d",&n) != EOF){
    		while(n--){
    			Node *root;
    			createTree(root);
    			scanf("%d %d",&a,&b);
    			top1 = -1;top2 = -1;
    			if(!getPath(root,a,path1,top1)){
    				printf("My God
    ");
    				continue;
    			}
    			if(!getPath(root,b,path2,top2)){
    				printf("My God
    ");
    				continue;
    			}
    			destory(root);
    			printf("%d
    ",getCommonNode(path1,path2));	
    		}
    	}
    	return 0;	
    }


  • 相关阅读:
    字符串导出xml文件并弹出下载对话框
    Resource interpreted as Document but transferred with MIME type application/json
    org.w3c.dom document 和xml 字符串 互转
    Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException
    plsql developer中如何设置sql window显示行号
    Oracle表数据转换为XML格式数据
    Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间
    JS 中Json常用操作
    详解html中的marquee属性
    .net core 3.0中的Json API
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3170135.html
Copyright © 2011-2022 走看看