트리는 n(n>=0)개의 제한된 노드로 구성된 계층적 관계의 집합인 비선형 데이터 구조입니다. 거꾸로 된 나무, 즉 뿌리가 위를 향하고 잎이 아래를 향하고 있기 때문에 나무라고 불립니다.
a. 노드의 차수: 위와 같이 노드의 하위 트리 수: A의 차수는 6, J의 차수는 2
b입니다. 트리의 차수: 트리의 수, 가장 큰 노드의 차수는 위 그림에 표시된 대로 수의 차수입니다. 트리의 차수는 6
c입니다. 차수가 0인 노드(하위 트리가 없는 노드)
d. 부모 매듭 점/부모 노드: 위 그림과 같이: D는 H
의 부모 노드입니다. 자식 노드/자식 노드: 위 그림과 같습니다. : H는 D
e의 하위 노드입니다. 루트 노드: 위 그림과 같이 부모가 없는 노드: A
f. 노드의 수준: 루트 정의부터 시작합니다. 첫 번째 수준, 루트의 하위 노드는 두 번째 수준입니다.
g. 트리의 높이 또는 깊이: 위에 표시된 대로 트리의 최대 수준입니다. 4
각 노드는 최대 2개의 하위 트리, 차수
a. 비자엽도는 2
b. 완전 이진 트리: 전체 이진 트리에 "오른쪽 하단 모서리"가 없습니다.
a. tree
1. 높이가 K이면 2^k-1개의 노드가 있습니다
2. 레벨이 K이면 레이어에 2^(k-1)개의 노드가 있습니다
3. 노드 수 - 1
4차수가 0인 n0과 2차가 있는 n2가 있으며, n0 = n2 + 1
b입니다. 올바른 자식이 있으면 반드시 있어야 합니다. 왼쪽 자식
2. 차수가 1인 노드는 하나만 있을 수 있습니다.2.5 이진 트리의 저장 이진 트리의 저장 구조는 연결 목록과 유사한 순차 저장과 연결 저장으로 나뉩니다. 순차 저장소: 완전한 이진 트리만 저장할 수 있습니다. 체인 저장소: 일반 이진 트리 이번에는 체인 저장소를 보여줍니다. 이진 트리의 체인 저장소는 노드별로 하나씩 참조됩니다. 삼항 표현,이 그림을 예로 들면, 세부 사항은 다음과 같습니다:
// 孩子表示法 private static class TreeNode{ char val; TreeNode left; TreeNode right; public TreeNode(char val) { this.val = val; } }
public static TreeNode build(){ TreeNode nodeA=new TreeNode('A'); TreeNode nodeB=new TreeNode('B'); TreeNode nodeC=new TreeNode('C'); TreeNode nodeD=new TreeNode('D'); TreeNode nodeE=new TreeNode('E'); TreeNode nodeF=new TreeNode('F'); TreeNode nodeG=new TreeNode('G'); TreeNode nodeH=new TreeNode('H'); nodeA.left=nodeB; nodeA.right=nodeC; nodeB.left=nodeD; nodeB.right=nodeE; nodeE.right=nodeH; nodeC.left=nodeF; nodeC.right=nodeG; return nodeA; }
//先序遍历 : 根左右 public static void preOrder(TreeNode root){ if(root==null){ return; } System.out.print(root.val+" "); preOrder(root.left); preOrder(root.right); }
//中序遍历 public static void inOrder(TreeNode root){ if(root==null){ return; } preOrder(root.left); System.out.print(root.val+" "); preOrder(root.right); }
//后序遍历 public static void postOrder(TreeNode root){ if(root==null){ return; } preOrder(root.left); preOrder(root.right); System.out.print(root.val+" "); }
//方法2(迭代) //先序遍历 (迭代) public static void preOrderNonRecursion(TreeNode root){ if(root==null){ return ; } Deque<TreeNode> stack=new LinkedList<>(); stack.push(root); while (!stack.isEmpty()){ TreeNode cur=stack.pop(); System.out.print(cur.val+" "); if(cur.right!=null){ stack.push(cur.right); } if(cur.left!=null){ stack.push(cur.left); } } }
//方法2(迭代) //中序遍历 (迭代) public static void inorderTraversalNonRecursion(TreeNode root) { if(root==null){ return ; } Deque<TreeNode> stack=new LinkedList<>(); // 当前走到的节点 TreeNode cur=root; while (!stack.isEmpty() || cur!=null){ // 不管三七二十一,先一路向左走到根儿~ while (cur!=null){ stack.push(cur); cur=cur.left; } // 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点 cur=stack.pop(); System.out.print(cur.val+" "); // 继续访问右子树 cur=cur.right; } }
//方法2(迭代) //后序遍历 (迭代) public static void postOrderNonRecursion(TreeNode root){ if(root==null){ return; } Deque<TreeNode> stack=new LinkedList<>(); TreeNode cur=root; TreeNode prev=null; while (!stack.isEmpty() || cur!=null){ while (cur!=null){ stack.push(cur); cur=cur.left; } cur=stack.pop(); if(cur.right==null || prev==cur.right){ System.out.print(cur.val+" "); prev=cur; cur=null; }else { stack.push(cur); cur=cur.right; } } }
//方法1(递归) //传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数 //此时的访问就不再是输出节点值,而是计数器 + 1操作 public static int getNodes(TreeNode root){ if(root==null){ return 0; } return 1+getNodes(root.left)+getNodes(root.right); } //方法2(迭代) //使用层序遍历来统计当前树中的节点个数 public static int getNodesNoRecursion(TreeNode root){ if(root==null){ return 0; } int size=0; Deque<TreeNode> queue=new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode cur = queue.poll(); size++; if (cur.left != null) { queue.offer(cur.left); } if (cur.right != null) { queue.offer(cur.right); } } return size; }
//方法1(递归) //传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数 public static int getLeafNodes(TreeNode root){ if(root==null){ return 0; } if(root.left==null && root.right==null){ return 1; } return getLeafNodes(root.left)+getLeafNodes(root.right); } //方法2(迭代) //使用层序遍历来统计叶子结点的个数 public static int getLeafNodesNoRecursion(TreeNode root){ if(root==null){ return 0; } int size=0; Deque<TreeNode> queue=new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()){ TreeNode cur=queue.poll(); if(cur.left==null && cur.right==null){ size++; } if(cur.left!=null){ queue.offer(cur.left); } if(cur.right!=null){ queue.offer(cur.right); } } return size; }
//求出以root为根节点的二叉树第k层的节点个数 public static int getKLevelNodes(TreeNode root,int k){ if(root==null || k<=0){ return 0; } if(k==1){ return 1; } return getKLevelNodes(root.left,k-1)+getKLevelNodes(root.right,k-1); }
//传入一个以root为根节点的二叉树,就能求出该树的高度 public static int height(TreeNode root){ if(root==null){ return 0; } return 1+ Math.max(height(root.left),height(root.right)); }
위 내용은 Java의 이진 트리에 대한 기본 지식과 개념은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!