두 갈래 나무 필기시험 면접 문제 집합
두 갈래 나무 깊이
public int TreeDepth(TreeNode root) {
if(root==null)
return 0;
int left=TreeDepth(root.left)+1;
int right=TreeDepth(root.right)+1;
return Math.max(left,right);
}
판단 평형 두 갈래 나무
한 가지 방법은 두 갈래 나무의 깊이를 구하여 뿌리 노드부터 귀속시킬 수 있다.좌우 깊이를 다시 구하여 비교하다.마지막으로 잎 노드를 구하다.하지만 반복된다.또 다른 방법은 뒷순서를 이용하여 사고방식을 두루 훑어볼 수 있다.뿌리 결점을 두루 훑어보았을 때 좌우 나무는 이미 판단을 하였기 때문에 반복적으로 훑어보는 경우는 없을 것이다.
public class Solution {
private boolean isBalanced=true;
public boolean IsBalanced_Solution(TreeNode root){
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root){
if(root==null)
return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
if(Math.abs(left-right)>1)
isBalanced=false;
return right>left?right+1:left+1;
}
}
두 갈래 검색 트리의 뒷순서 반복 시퀀스 여부를 판단합니다
예를 들어 수조 {5, 7, 6, 9, 11, 10, 8}은 두 갈래 검색 트리의 뒷순서를 훑어보는 서열입니다.발견 뿌리 노드 8576은 8보다 작고 8 왼쪽 나무, 91110은 8보다 크면 오른쪽 나무, 6은 왼쪽 나무 뿌리 노드, 10은 오른쪽 나무 뿌리 노드, 발견은 귀속 문제 방법: 이동 후 훑어보고 뿌리 노드보다 크면 오른쪽 나무이다.오른쪽 트리 노드를 훑어보고 오른쪽 트리에 노드 값이 루트 노드보다 작으면false로 돌아갑니다.왼쪽 나무, 오른쪽 나무에 대해 귀속 판단을 하다.
public boolean judge(int[] a,int start,int end){
if(start>=end)
return true;
int i=start;
while(i
두 갈래 트리 중 하나가 되는 경로
제목 설명: 두 갈래 트리와 정수를 입력하고 두 갈래 트리의 결점 값과 정수를 입력하기 위한 모든 경로를 출력합니다.경로는 나무의 뿌리 결점에서 시작하여 잎 결점까지 내려가는 결점으로 경로를 형성합니다.DFS 질문, 스택도 사용할 수 있고 list도 사용할 수 있습니다.
public ArrayList> FindPath(TreeNode root,int target) {
ArrayList> all=new ArrayList>();
if(root==null)
return all;
Stack stack=new Stack();
FindPath(root, target,stack,all);
return all;
}
void FindPath(TreeNode root,int target,Stack stack, ArrayList> all){
if(root==null)
return;
if((root.left==null&&root.right==null)&&root.val==target){
ArrayList list=new ArrayList<>();
for(int i:stack){
list.add(new Integer(i));
}
list.add(new Integer(root.val));
all.add(list);
}else{
stack.push(new Integer(root.val));
FindPath(root.left,target-root.val,stack,all);
FindPath(root.right, target-root.val, stack, all);
stack.pop();
}
}
두 갈래 나무를 거울로 바꾸다
선순환하는 방법과 유사하다
public void mirror(TreeNode node){
if(node==null)
return;
TreeNode n=node.left;
node.left=node.right;
node.right=n;
mirror(node.left);
mirror(node.right);
}
두 갈래 나무의 대칭 여부를 판단하다
왼쪽 노드의 오른쪽 트리와 오른쪽 노드의 왼쪽 트리는 같은 귀속을 사용합니다
boolean isSymmetrical(TreeNode pRoot){
if(pRoot==null)
return true;
return comRoot(pRoot.left,pRoot.right);
}
boolean comRoot(TreeNode left,TreeNode right){
if(left==null)
return right==null;
if(right==null)
return false;
if(left.val!=right.val)
return false;
return comRoot(left.right, right.left)&&comRoot(left.left, right.right);
}
나무의 하위 구조
두 그루의 두 갈래 나무 A, B를 입력하여 B가 A의 자 구조인지 아닌지를 판단한다.(ps: 우리는 빈 나무가 임의의 나무의 하위 구조가 아니라고 약속합니다) 첫 번째 단계: 뿌리 마디 값과 같은 노드를 찾습니다. 실제로는 나무의 역력입니다.차례로 실현될 수 있다.두 번째 단계: 트리 A에서 R을 루트 노드로 하는 하위 트리가 트리 B와 같은 구조를 가지고 있는지 판단한다.값이 다르면 틀림없이 다르다.만약 같다면 각자의 좌우 노드를 다시 귀속적으로 판단한다.조건을 종료하면 트리 A 또는 트리 B 루트 노드에 도달합니다.
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result=false;
if(root1!=null&&root2!=null){
if(root1.val==root2.val){
result=DoesTree1HaveTree2(root1,root2);
}
if(!result)
result=HasSubtree(root1.left, root2);
if(!result)
result=HasSubtree(root1.right, root2);
}
return result;
}
public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){
if(root1==null&&root2!=null)
return false;
if(root2==null)
return true;
if(root1.val!=root2.val)
return false;
return DoesTree1HaveTree2(root1.left, root2.left)&&DoesTree1HaveTree2(root1.right, root2.right);
}
}
여러 줄 인쇄 두 갈래 나무
public ArrayList > Print(TreeNode pRoot) {
ArrayList> result=new ArrayList>();
if(pRoot==null)
return result;
Queue layer=new LinkedList<>();
ArrayList list=new ArrayList();
layer.add(pRoot);
int start=0,end=1;
while(!layer.isEmpty()){
TreeNode cur=layer.remove();
list.add(cur.val);
start++;
if(cur.left!=null)
layer.add(cur.left);
if(cur.right!=null)
layer.add(cur.right);
if(start==end){
end=layer.size();
start=0;
result.add(list);
list=new ArrayList<>();
}
}
return result;
}
지그재그 인쇄 두 갈래 나무
창고 후진 선출의 특성을 이용하여 두 창고 하나의 메모리 층 노드, 하나의 메모리 층 노드
/*
* , ,
* , , 。
*/
//{8,6,10,5,7,9,11}
public static ArrayList> Print(TreeNode pRoot) {
ArrayList> all=new ArrayList>();
int layer=1;
Stack s1=new Stack();
Stack s2=new Stack();
s1.push(pRoot);
while(!s1.empty()||!s2.empty()){
if(layer%2!=0){
ArrayList temp=new ArrayList();
while(!s1.empty()){
TreeNode node=s1.pop();
if(node!=null){
temp.add(node.val);
System.out.print(node.val + " ");
s2.push(node.left);
s2.push(node.right);
}
}
if(!temp.isEmpty()){
all.add(temp);
layer++;
System.out.println();
}
}else{
ArrayList temp=new ArrayList();
while(!s2.empty()){
TreeNode node=s2.pop();
if(node!=null){
temp.add(node.val);
System.out.print(node.val + " ");
s1.push(node.right);
s1.push(node.left);
}
}
if(!temp.isEmpty()){
all.add(temp);
layer++;
System.out.println();
}
}
}
return all;
}
두 갈래 나무를 재구성하다
두 갈래 나무의 앞 순서와 중간 순서의 결과를 입력하십시오. 이 두 갈래 나무를 다시 만드십시오.입력한 앞 순서와 중간 순서의 결과에 중복된 숫자가 없다고 가정하십시오.예를 들어 앞 순서 반복 시퀀스 {1,2,4,7,3,5,6,8}와 중간 순서 반복 시퀀스 {4,7,2,1,5,3,8,6}를 입력하면 두 갈래 트리를 재건하고 되돌려줍니다.
public TreeNode reConstructBinaryTree(int[] pre,int[] in){
if(pre.length==0||in.length==0)
return null;
TreeNode node=new TreeNode(pre[0]);
for(int i=0;i
두 번째 검색 트리의 k 노드
두 갈래 수색 트리를 정해 주십시오. 그 중 두 번째로 큰 결점을 찾아 주십시오.예를 들어, 5/\3 7/\/\2 4 6 8에서 세 번째 결점의 값은 결점 수치 크기 순서대로 4입니다.
public class Solution {
int index=0;
TreeNode KthNode(TreeNode root, int k)
{
if(root!=null){
TreeNode node=KthNode(root.left,k);
if(node!=null)
return node;
index++;
if(index==k)
return root;
node=KthNode(root.right,k);
if(node!=null)
return node;
}
return null;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.