二叉树寻找两个结点的公共子节点

//
//  main.cpp
//  test
//
//  Created by MaKai on 2017/3/18.
//  Copyright © 2017年 MaKai. All rights reserved.
//

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include "cmath"
using namespace std;

struct Node{
    int val;
    Node* left;
    Node* right;
    Node(int val){
        this->left = this->right = NULL;
        this->val = val;
    }
};

Node* findSameParent(Node* root, Node* n1, Node* n2);
void findNodePath(string &p, Node* root, Node* node, string s);

int main(int argc, const char * argv[]) {
    
    Node* n1 = new Node(1);
    Node* n2 = new Node(2);
    Node* n3 = new Node(3);
    Node* n4 = new Node(4);
    Node* n5 = new Node(5);
    Node* n6 = new Node(6);
    n1->left = n2;
    n1->right = n4;
    n2->left = n3;
    n2->right = n6;
    n4->right = n5;
    
    cout<<findSameParent(n1, n3, n6)->val<<endl;
    
    return 0;
}


Node* findSameParent(Node* root, Node* n1, Node* n2) {
    
    string s1 = "";
    string s2 = "";
    findNodePath(s1, root, n1, "r");
    findNodePath(s2, root, n2, "r");
    cout<<s1<<" "<<s2<<endl;

    Node* node = root;
    for (int i = 1; i < min(s1.size(), s2.size()); i++) {
        if (s1[i] == s2[i]) {
            if (s1[i] == '0') {
                node = node->left;
            }else{
                node = node->right;
            }
        }else{
            break;
        }
    }
    
    return node;
}

void findNodePath(string &p, Node* root, Node* node, string s){
    if (root == node) {
        p = s;
        return;
    }
    
    if (root->left) {
        findNodePath(p, root->left, node, s.append("0"));
        s.erase(s.end() - 1);
    }
    if (root->right) {
        findNodePath(p, root->right, node, s.append("1"));
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容