두 갈래 나무(2)
두 갈래 나무의 두 결점의 최대 공통 부모 노드를 구하다
1
/2 3//4 5 6 7////위 그림에서 보듯이 정수 1, 2, 3,...무한히 큰 두 갈래 나무를 이루었다.어떤 결점에서 루트 결점(번호 1의 결점)까지는 유일한 경로가 있다. 예를 들어 5에서 루트 결점까지의 경로는 (5, 2, 1)이고, 4에서 루트 결점까지의 경로는 (4, 2, 1)이며, 루트 결점 1에서 루트 결점까지의 경로에는 하나의 결점 1만 포함되기 때문에 경로는 (1)이다.두 결점 x와 y에 대해 그들이 뿌리 결점까지의 경로가 각각 (x1,x2,..., 1)과 (y1,y2,..., 1)이라고 가정하면 반드시 두 개의 정수 i와 j가 존재하기 때문에 xi와 yj부터 시작하여 xi=yj,xi+1=yj+1,xi+2=yj+2,...현재의 문제는 x와 y를 정하고 그들의 공공 부모 노드, 즉 xi(즉 yj)를 요구하는 것이다.
예제
입력
10 4 // , x y(1≤x, y≤2^31-1)。
출력
2 // , xi, 。
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()) {
int x=scanner.nextInt();
int y=scanner.nextInt();
while(x!=y) {
if(x>y)
x=x/2;
else
y=y/2;
}
System.out.println(x);
}
}
}
// https://blog.csdn.net/zd454909951/article/details/78855707
C++
#include
#include
#include
using namespace std;
int main(){
// freopen("a.txt", "r", stdin);
int x, y;
while(cin >> x >> y){
// , y
while(x != y){
if(x > y){
x /= 2;
}
else{
y /= 2;
}
}
cout << x << endl;
}
return 0;
}
//https://blog.csdn.net/Void_worker/article/details/81123175
두 갈래 나무의 서열화
두 갈래 나무가 파일로 기록되는 과정을 두 갈래 나무의 서열화라고 한다.서열화하는 방법은 매우 많다. 여기서 우리는 괄호 서열의 방법으로 그것을 서열화한다. 이른바 괄호 서열은 한 노드에 대해 괄호를 생성하는 것을 가리킨다. 괄호 안은 그 하위 나무의 괄호 서열이다. 그 중에서 왼쪽 아들(존재하는 경우)의 괄호는 앞에 있고 오른쪽 아들(존재하는 경우)의 괄호는 뒤에 있다.주어진 트리에 대해 효율적인 알고리즘을 설계하여 서열화하십시오.
트리의 루트 노드 바늘 루트를 지정합니다. 서열화된 괄호 서열을 나타내는 문자열을 되돌려 주십시오.
C++
//https://www.nowcoder.com/questionTerminal/e3a3a1a956914d8ca5688ea47a5cf9c9
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class TreeToSequence {
public String toSequence(TreeNode root) {
// write code here
String str="";ui,,0/'[-;;;0]'
return "";
}else{
str="(";
str+=toSequence(root.left);
str+=toSequence(root.right);
str+=")";
return str;
}
}
}
Java
//https://www.nowcoder.com/questionTerminal/e3a3a1a956914d8ca5688ea47a5cf9c9
class TreeToSequence {
public:
string getAns(TreeNode *root){
string temp;
if(!root) return temp;
string s1,s2;
if(root->left)
s1 = getAns(root->left);
if(root->right)
s2 =getAns(root->right);
temp+='(';
temp+=s1;
temp+=s2;
temp+=')';
return temp;
}
string toSequence(TreeNode* root) {
string ans;
if(!root) return ans;
ans=getAns(root);
return ans;
}
};
두 갈래 나무 한 그루를 주어 이 나무의 중서로 되돌아가다
예:
주어진 두 갈래 나무는 {1,#,2,3},
1↵ ↵ 2↵ /↵ 3↵
[1,3,2]로 돌아갑니다.
비고: 귀속적인 해법은 너무 새롭지 않다. 너는 교체적인 방법으로 이 문제를 풀 수 있니?
"{1,#,2,3}"의 의미를 잘 모르면 계속 읽어주세요
우리는 다음과 같은 방법으로 두 갈래 나무를 서열화한다.
두 갈래 나무의 서열화는 층층이 훑어보는 원칙에 따른다. # "이 위치는 하나의 경로의 종결이고 아래에 결점이 더 이상 존재하지 않는다는 것을 대표한다.
예:
1↵ / ↵ 2 3↵ /↵ 4↵ ↵ 5
상술한 두 갈래 나무의 서열화 결과는'{1,2,3,#,#,4,#,#,5}'이다.
Java
//https://www.nowcoder.com/questionTerminal/1b25a41f25f241228abd7eb9b768ab9b
/*
*
*/
public ArrayList inorderTraversal(TreeNode root) {
Stack stack = new Stack();
ArrayList res = new ArrayList();
TreeNode node = root;
while (!stack.isEmpty() || node != null) {
while (node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
res.add(node.val);
node = node.right;
}
return res;
}
C++
//https://www.nowcoder.com/questionTerminal/1b25a41f25f241228abd7eb9b768ab9b
class Solution {
public:
vector inorderTraversal(TreeNode *root) {
vector result;
if(!root)
return result;
stack s;
TreeNode *p=root;
while(!s.empty() || p!=NULL)
{
while(p)
{
s.push(p);
p=p->left;
}
if(!s.empty())
{
p = s.top();
s.pop();
result.push_back(p->val);
p = p->right;
}
}
return result;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.